ZLMediaKit

简介

一个基于C++11的高性能运营级流媒体服务框架

基于C++11开发,避免使用裸指针,代码稳定可靠,性能优越。

支持多种协议(RTSP/RTMP/HLS/HTTP-FLV/WebSocket-FLV/GB28181/HTTP-TS/
WebSocket-TS/HTTP-fMP4/WebSocket-fMP4/MP4/WebRTC),支持协议互转。

使用多路复用/多线程/异步网络IO模式开发,并发性能优越,支持海量客户端连接。

代码经过长期大量的稳定性、性能测试,已经在线上商用验证已久。

支持linux、macos、ios、android、windows全平台。

支持画面秒开、极低延时(500毫秒内,最低可达100毫秒)。

提供完善的标准C API,可以作SDK用,或供其他语言调用。

提供完整的MediaServer服务器,可以免开发直接部署为商用服务器。

提供完善的restful api以及web hook,支持丰富的业务逻辑。

打通了视频监控协议栈与直播协议栈,对RTSP/RTMP支持都很完善。

全面支持H265/H264/AAC/G711/OPUS。

功能完善,支持集群、按需转协议、按需推拉流、先播后推、断连续推等功能。

极致性能,单机10W级别播放器,100Gb/s级别io带宽能力。

全面支持ipv6网络

功能清单

协议支持

RTSP[S]

RTSP[S] 服务器,支持RTMP/MP4/HLS转RTSP[S],支持亚马逊echo show这样的设备。

RTSP[S] 播放器,支持RTSP代理,支持生成静音音频。

RTSP[S] 推流客户端与服务器。

支持 rtp over udp rtp over tcp rtp over http rtp组播 四种RTP传输方式。

服务器/客户端完整支持Basic/Digest方式的登录鉴权,全异步可配置化的鉴权接口。

支持H265编码。

服务器支持RTSP推流(包括rtp over udp rtp over tcp方式)。

支持H264/H265/AAC/G711/OPUS编码,其他编码能转发但不能转协议。

RTMP[S]

RTMP[S] 播放服务器,支持RTSP/MP4/HLS转RTMP。

RTMP[S] 发布服务器,支持录制发布流。

RTMP[S] 播放器,支持RTMP代理,支持生成静音音频。

RTMP[S] 推流客户端。

支持http[s]-flv直播。

支持websocket-flv直播。

支持H264/H265/AAC/G711/OPUS编码,其他编码能转发但不能转协议。

支持RTMP-H265。

支持RTMP-OPUS。

HLS

支持HLS文件生成,自带HTTP文件服务器。

通过cookie追踪技术,可以模拟HLS播放为长连接,可以实现HLS按需拉流、播放统计等业务。

支持HLS播发器,支持拉流HLS转rtsp/rtmp/mp4。

支持H264/H265/AAC/G711/OPUS编码。

TS

支持http[s]-ts直播。

支持ws[s]-ts直播。

支持H264/H265/AAC/G711/OPUS编码。

fMP4

支持http[s]-fmp4直播。

支持ws[s]-fmp4直播。

支持H264/H265/AAC/G711/OPUS编码。

HTTP[S]与WebSocket

服务器支持目录索引生成,文件下载,表单提交请求。

客户端提供文件下载器(支持断点续传),接口请求器,文件上传器。

完整HTTP API服务器,可以作为web后台开发框架。

支持跨域访问。

支持http客户端、服务器cookie。

支持WebSocket服务器和客户端。

支持http文件访问鉴权。

GB28181与RTP推流

支持UDP/TCP国标RTP(PS或TS)推流服务器,可以转换成RTSP/RTMP/HLS等协议。

支持RTSP/RTMP/HLS转国标推流客户端,支持TCP/UDP模式,提供相应restful api。

支持H264/H265/AAC/G711/OPUS编码。

支持海康ehome推流。

MP4点播与录制

支持录制为FLV/HLS/MP4
RTSP/RTMP/HTTP-FLV/WS-FLV支持MP4文件点播,支持seek
支持H264/H265/AAC/G711/OPUS编码

WebRTC

支持WebRTC推流,支持转其他协议。

支持WebRTC播放,支持其他协议转WebRTC。

支持双向echo test。

支持simulcast推流。

支持上下行rtx/nack丢包重传。

支持单端口、多线程、客户端网络连接迁移(开源界唯一)。

支持TWCC rtcp动态调整码率。

支持remb/pli/sr/rr rtcp。

支持rtp扩展解析。

支持GOP缓冲,webrtc播放秒开。

支持datachannel。

SRT支持

其他

支持丰富的restful api以及web hook事件。

支持简单的telnet调试。

支持配置文件热加载。

支持流量统计、推拉流鉴权等事件。

支持虚拟主机,可以隔离不同域名。

支持按需拉流,无人观看自动关断拉流。

支持先播放后推流,提高及时推流画面打开率。

提供c api sdk。
支持FFmpeg拉流代理任意格式的流。

支持http api生成并返回实时截图。

支持按需解复用、转协议,当有人观看时才开启转协议,降低cpu占用率。

支持溯源模式的集群部署,溯源方式支持rtsp/rtmp/hls/http-ts, 边沿站支持hls, 源站支持多个(采用round robin方式溯源)。

rtsp/rtmp/webrtc推流异常断开后,可以在超时时间内重连推流,播放器无感知。

应用场景

ZLMediaKit流媒体服务器主要用于做视频点播和视频直播的基础支撑软件系统,例如:在线课堂、网络电视、视频点播、视频资讯、短视频、网络直播、企业直播等。

从项目项目开发的角度来讲,ZLMediaKit流媒体服务器将您在构建在线应用中的与视频相关的工作集中处理,使得您可以只关注业务细节而不用再去处理与视频相关的诸多技术细节,从而实现提高项目实施效率、降低项目实施风险的目标。

从产品作用上将,ZLMediaKit流媒体服务器能够在一定的主机配置条件和网络带宽条件下提供流畅的、高并发的视频播出能力。因为流媒体服务器本身在视频播出方面做了诸多优化,如码流控制、IO优化、竞争处理等,使得充分利用硬件和网络能力,提供尽可能多的并发能力。

作为视频点播服务器,ZLMediaKit流媒体服务器提供的主要功能包括:接收视频文件上传、视频转码、视频存储和管理、视频播出地址发布、多终端适配等。大部分流媒体服务器会在转码结束后生成多种播出协议,可以面向网页、iOS终端、Android终端提供播出地址。

作为视频直播服务器,流媒体服务器提供的主要功能包括:直播流接收(如接收rtmp协议推流)、直播流转发和播出、发布直播地址给播放端、直播录制、生成回看地址等。大部分流媒体服务器会输出多种协议的直播地址,以适配不同终端的播放需求,这些播出地址包括:rtmp协议地址、http-flv协议地址、HLS地址等。

随着技术的发展,流媒体服务器的技术和产品也一直在不断的发展和演进,视频播出技术发展的趋势包括:

1)高清视频为主(1080p、4K),高码率播出(>2Mbps)。

2)H264依然是主要视频编码格式,VP9/H265在有些应用中也开始采用。

3)视频传输更多的采用http协议,Flash播放器逐步被淘汰。

4)采用WebRTC、Websocket协议进行视频播出的应用越来越多。

5)双向视频应用越来越多,在在线教学、会议直播等直播应用中成为标配。

实战与学习

ZLMediaKit webRTC编译与测试

下载zlm源码

#国内用户推荐从同步镜像网站gitee下载 
git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
#千万不要忘记执行这句命令,下载需要的子模块
git submodule update --init

编译

确定openssl版本

1、查看版本:openssl verison
2、openssl 安装
$ wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
$ tar -xvzf openssl-1.1.1k.tar.gz
$ yum install -y zlib zlib-devel perl-CPAN
$ ./config shared --openssldir=/usr/local/openssl --prefix=/usr/local/openssl
$ make && make install
$ echo "/usr/local/lib64/" >> /etc/ld.so.conf
$ echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
$ ldconfig
$ ln -s /usr/local/openssl/bin/openssl  /usr/local/bin/openssl # 替换系统openssl,非必须
$ openssl version -a

3、编译
$ mkdir build
$ cd build
$ cmake .. -D CMAKE_BUILD_TYPE=RELEASE -D ENABLE_WEBRTC=true  -D OPENSSL_ROOT_DIR=/usr/local/openssl  -D OPENSSL_LIBRARIES=/usr/local/openssl/lib
$ cmake --build . --target MediaServer

测试

编译在/data/ZLMediaKit/release/linux/Release目录下。
将ZLMediaKit根目录的www文件夹和ssl证书移动到/data/ZLMediaKit/release/linux/Release目录下。
启动服务器程序。

rtsp方式推流

# h264编码
ffmpeg -re -i test.mp4 -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test

# h265编码
ffmpeg -re -i test.mp4 -vcodec h265 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test

zlmediakit中会看到多个媒体注册的消息,同时支持 rtsp、rtmp、hls等协议,现在可以另一台机器上开个播放器播放了,像 vlc、ffplay 都可以,播放的 url 是

rtsp://192.168.101.138/live/test
rtmp://192.168.101.138/live/test
http://192.168.101.138/live/test/hls.m3u8

192.168.101.138就是zlmediakit媒体服务器的地址。

具体协议的端口号在配置文件 config.ini 中进行配置,这个 ini 文件也是视频服务器的配置文件,可以根据自己的实际情况进行修改。

使用rtmp方式推流

ffmpeg -re -i test.mp4 -vcodec h264 -acodec aac -f flv rtmp://127.0.0.1/live/test

RTMP标准不支持H265,但是国内有自行扩展的,如果你想让ffmpeg支持RTMP-H265,需要重新编译ffmpeg,可以参考:https://github.com/ksvc/FFmpeg/wiki/hevcpush

ffmpeg 推流成功后,服务器端产生的 url 与 上面的rtsp 推流方式类似,这里不再赘述

使用rtp方式推流

ffmpeg -re -i test.mp4 -vcodec h264 -acodec aac -f rtp_mpegts rtp://127.0.0.1:10000

ffmpeg 推送后,服务器端输出了对应流的 ID

拿到了这个 ID 后,这时候就可以拼接 url 进行播放了,如

rtmp://192.168.101.138/rtp/C20C27F2
http://192.168.101.138/rtp/C20C27F2/hls.m3u8
rtsp://192.168.101.138/rtp/C20C27F2

api

MediaServer是ZLMediaKit的主进程,目前支持以下http api接口,这些接口全部支持GET/POST方式,

"/index/api/addFFmpegSource",
"/index/api/addStreamProxy",
"/index/api/close_stream",
"/index/api/close_streams",
"/index/api/delFFmpegSource",
"/index/api/delStreamProxy",
"/index/api/getAllSession",
"/index/api/getApiList",
"/index/api/getMediaList",
"/index/api/getServerConfig",
"/index/api/getThreadsLoad",
"/index/api/getWorkThreadsLoad",
"/index/api/kick_session",
"/index/api/kick_sessions",
"/index/api/restartServer",
"/index/api/setServerConfig",
"/index/api/isMediaOnline",
"/index/api/getMediaInfo",
"/index/api/getRtpInfo",
"/index/api/getMp4RecordFile",
"/index/api/startRecord",
"/index/api/stopRecord",
"/index/api/getRecordStatus",
"/index/api/getSnap",
"/index/api/openRtpServer",
"/index/api/closeRtpServer",
"/index/api/listRtpServer",
"/index/api/startSendRtp",
"/index/api/stopSendRtp",
"/index/api/getStatistic",
"/index/api/addStreamPusherProxy",
"/index/api/delStreamPusherProxy"

性能参数

ZLMediaKit的主要性能瓶颈在带宽。
以万兆网卡为例,Tcp传输可达到8G左右,udp传输在3-4G左右。
为提高带宽的利用率,节省成本以及减少丢包、卡顿等问题最好是使用tcp进行音视频流的传输。
当然udp实时性更高,但是现场环境udp丢包较多。