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/

相关推荐
主机哥哥1 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
ManThink Technology2 小时前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
iWZXQxBO2 小时前
运动控制卡 倒R角程序 G代码 halcon联合运动控制卡联合相机 运动控制卡内容
音视频
珠海西格电力科技2 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
QT.qtqtqtqtqt2 小时前
未授权访问漏洞
网络·安全·web安全
释怀不想释怀3 小时前
Linux环境变量
linux·运维·服务器
zzzsde3 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
半壶清水3 小时前
[软考网规考点笔记]-软件开发、项目管理与知识产权核心知识与真题解析
网络·笔记·压力测试
JMchen1233 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
yuanmenghao3 小时前
Linux 性能实战 | 第 7 篇 CPU 核心负载与调度器概念
linux·网络·性能优化·unix