目录
[二、 ZLMediaKit安装、运行(Ubuntu)](#二、 ZLMediaKit安装、运行(Ubuntu))
一、ZLMediaKit介绍
ZLMediaKit是一个基于C++11的高性能运营级流媒体服务框架,项目地址:https://github.com/ZLMediaKit/ZLMediaKit
ZLMediaKit支持多种协议转发,入下图所示(摘自ZLMediaKit项目):
GB28181的RTP推流支持如下功能:
- 支持UDP/TCP RTP(PS/TS/ES)推流服务器,可以转换成RTSP/RTMP/HLS等协议
- 支持RTSP/RTMP/HLS等协议转rtp推流客户端,支持TCP/UDP模式,提供相应restful api,支持主动被动方式
- 支持H264/H265/AAC/G711/OPUS编码
- 支持es/ps/ts/ehome rtp推流
- 支持es/ps rtp转推
- 支持GB28181主动拉流模式
- 支持双向语音对讲
- 支持多轨道模式
二、 ZLMediaKit安装、运行(Ubuntu)
1、安装
#国内用户推荐从同步镜像网站gitee下载
git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
#千万不要忘记执行这句命令
git submodule update --init
sudo apt-get install build-essential
sudo apt-get install cmake
#除了openssl,其他其实都可以不安装
sudo apt-get install libssl-dev
sudo apt-get install libsdl-dev
sudo apt-get install libavcodec-dev
sudo apt-get install libavutil-dev
sudo apt-get install ffmpeg
mkdir build
cd build
#macOS下可能需要这样指定openss路径:cmake .. -DOPENSSL_ROOT_DIR=/usr/local/Cellar/openssl/1.0.2j/
cmake ..
make -j4
2、运行
cd ZLMediaKit/release/linux/Debug
#通过-h可以了解启动参数
./MediaServer -h
#以守护进程模式启动
./MediaServer -d &
3、配置
配置文件:ZLMediaKit/release/linux/Debug/config.ini
各个配置项的含义参考项目wiki中的说明。
三、ZLMediaKit使用
ZLMediaKit的HTTP API是一组通过HTTP协议访问的接口,用于控制和管理ZLMediaKit流媒体服务器的功能和状态。通过以下访问可查看api列表:
curl http://127.0.0.1/index/api/getApiList?secret=xxxxxxxxxxx
secret在配置文件中获取:ZLMediaKit/release/linux/Debug/config.ini
ZLMediaKit支持GB28181的 ps-rtp推流,支持的编码格式分别为h264/h265/aac/g711/opus。 在收到GB28181推流后,ZLMediaKit会依次做以下事情:
- rtp排序去重。
- rtp解析成ps或ts。
- ps或ts解析成h264/h265/aac/g711/opus。
- 输入到复用器,生成rtsp/rtmp/ts/fmp4等格式,以便转换成其他协议或容器。
GB28181简单使用:
ZLMediaKit默认开启10000端口用于接收UDP/TCP的GB28181推流,由于国标推流不好测试,ZLMediaKit同时也支持rtp_mpegts推流,代码会自适应判断是否为ps还是ts。 所以如果大家没有摄像头的情况下,可以用FFmpeg简单测试,基本上体验跟国标推流并无二致。
-
ffmpeg推流命令:
ffmpeg -re -i www/record/robot.mp4 -vcodec h264 -acodec aac -f rtp_mpegts rtp://127.0.0.1:10000
-
MediaServer收到推流后的日志:
上图中,这个推流的rtp ssrc为BFC2C622(16进制打印),这个流的app为rtp, stream_id为BFC2C622。
需要指出的是,国标推流的app固定为rtp,你只能通过代码来修改它,stream_id为rtp流的ssrc,这个是随机的,在FFmpeg中貌似没法控制。
另外,每次推流时,请更换ssrc,否则ZLMediaKit发现推流端ip和端口变化后,会直接丢弃rtp包;这样做的目的是为了防止两个设备使用同一个ssrc推流时互相干扰。
ZLMediaKit也可以往其他国标服务器推流,还有其他的高级功能。都是调用HTTP API实现的,具体可参考项目的wiki。
多个国标设备向ZLMediaKit推流时,都是向ZLMediaKit的10000端口推,ZLMediaKit会根据ip、端口以及RTP的ssrc区分不同的设备。但是在使用openRtpServer接口动态开启国标收流端口后,这个端口只能产生一个流,也就是说,一个摄像头需要一个服务器端口用于接收国标推流。
ZLMediaKit支持多种推拉流方式(RTSP/HLS/RTMP等),ZLMediaKit的播放url规则如下:
以rtsp://somedomain.com:554/live/0?token=abcdefg&field=value为例,该url分为以下几个部分:
协议(scheam) : rtsp协议,默认端口554
虚拟主机(vhost) : somedomain.com,该字段既可以是域名也可以是ip,如果是ip则对应的虚拟主机为__defaultVhost__
服务端口号(port) : 554,如果不指定端口号,则使用协议默认端口号
应用名(app) : live
流ID(streamid) : 0
参数(args) : token=abcdefg&field=value
刚才的rtp_mpegts推流中app和stream_id都可以看到,通过下面的地址就可以使用rtsp协议拉到流了:
rtsp://127.0.0.1/rtp/BFC2C622
更多操作请参考项目的wiki,地址:https://github.com/zlmediakit/ZLMediaKit/wiki/