GB28181系列三:GB28181流媒体服务器ZLMediaKit

我的音视频/流媒体开源项目(github)

GB28181系列目录

目录

一、ZLMediaKit介绍

[二、 ZLMediaKit安装、运行(Ubuntu)](#二、 ZLMediaKit安装、运行(Ubuntu))

1、安装

2、运行

3、配置

三、ZLMediaKit使用


一、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/

相关推荐
大明湖的狗凯.26 分钟前
Servlet、omcat服务器架构与工作原理
服务器·servlet·架构
王解34 分钟前
企业级包管理器之搭建 npm 私有服务器 (6)
服务器·前端·npm
优质&青年2 小时前
【故障处理--修改CI流水线】
linux·运维·服务器·ci/cd·云原生
MediaTea2 小时前
Ps:视频图层
音视频
网硕互联的小客服2 小时前
centos系统快捷命令有哪些?
运维·服务器·网络·centos
威视锐科技2 小时前
YunSDR通信小课堂-17
网络·网络协议·信息与通信
冰冰的coco2 小时前
音视频基础 -(编码、封装、推拉流)格式/协议 与 ffmpeg处理流程
ffmpeg·音视频
黑金IT3 小时前
编程语言对决:Node.js与Python在视频处理领域
python·node.js·音视频
清风孤客3 小时前
Vue.js 如何塑造现代网络体验
前端·网络·vue.js