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/

相关推荐
Sheffield2 天前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
茶杯梦轩4 天前
从零起步学习RabbitMQ || 第二章:RabbitMQ 深入理解概念 Producer、Consumer、Exchange、Queue 与企业实战案例
服务器·后端·消息队列
YuMiao6 天前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
Jony_9 天前
高可用移动网络连接
网络协议
Sinclair9 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
chilix9 天前
Linux 跨网段路由转发配置
网络协议
Rockbean10 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
茶杯梦轩10 天前
CompletableFuture 在 项目实战 中 创建异步任务 的核心优势及使用场景
服务器·后端·面试
海天鹰11 天前
【免费】PHP主机=域名+解析+主机
服务器
DianSan_ERP11 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet