系列文章目录
《ZLMediaKit源码学习笔记》(1)windows下VS2022源码编译
《ZLMediaKit源码学习笔记》(2)MediaServer作为RTSP转发服务器(本文)
前言
学习源码前,我们需要先熟悉如何使用ZLMediaKit提供的测试程序,正好本人手上有宇视摄像头,本节就测试下如何使用MediaServer来转发摄像头的RTSP流。
说明:依赖库ZLToolKit源码学习参见《ZLToolKit源码学习笔记》。
目录
一、背景
安防监控常见使用场景中,经常会出现这种情况:一个网络摄像机/网络录像机,有多个用户需要同时观看实况。而设备的取流是有上限的,无法满足所有用户都能观看成功。比如,一台IPC的取流上限只有10路,当已经有10个用户在局域网电脑上进行了实况预览,那么如果局域网内还有另一个用户也想访问实况就不行了。再或者NVR设备,假设支持的取流上限是64路,如果某个用户播放端上已经看了40路实况,那么就只剩下24路实况供其它用户观看了。
要解决以上限制,我们可以使用流媒体服务器来对设备的视频流进行转发,摄像机的视频流经流媒体服务器转发到不同的用户播放端,用户将不再直接向摄像机拉流,这样就能降低设备的取流压力,满足了多用户使用的需求。
在监控网络传输中,流媒体技术也可以降低网络中的带宽限制。当多个用户要查看同一路监控图像时,流媒体服务器将从IPC/NVR取流,并进行视频流的分发,对IPC/NVR而言只需要取一路视频流,服务器解除了发流设备的带宽限制以及发流端到流媒体的带宽限制,对于后续部分的监控网络传输带宽是没有影响的,这样就可以减少了网络的负荷。
二、实操
测试比较简单,MediaServer作为服务器,提供了一组restful api用来和客户端进行交互。具体参见MediaServer支持的HTTP API · ZLMediaKit/ZLMediaKit Wiki · GitHub。满足我们需求的api是以下这条:
动态添加rtsp/rtmp/hls拉流代理
/index/api/addStreamProxy
参数 | 是否必选 | 释意 |
---|---|---|
secret | Y | api操作密钥(配置文件配置),如果操作ip是127.0.0.1,则不需要此参数 |
vhost | Y | 添加的流的虚拟主机,例如__defaultVhost__
|
app | Y | 添加的流的应用名,例如live |
stream | Y | 添加的流的id名,例如test |
url | Y | 拉流地址,例如rtmp://live.hkstv.hk.lxdns.com/live/hks2 |
enable_hls | N | 是否转hls |
enable_mp4 | N | 是否mp4录制 |
rtp_type | N | rtsp拉流时,拉流方式,0:tcp,1:udp,2:组播 |
timeout_sec | N | 拉流超时时间,单位秒,float类型 |
测试实例:
我们可以直接在浏览器中测试,这里为方便后续操作,建议安装下postman,ZLMediaKit提供了对应的配置文件可以直接使用。
使用postman导入ZLM源码postman目录下的两个json文件,File->Import->Upload Files:
127.0.0.1.postman_environment.json
ZLMediaKit.postman_collection.json
使能环境变量,ZLMediaKit_URL配置的IP地址和端口必须与MediaServer中的一致,本地环境默认是127.0.0.1:80,这里不用修改。
具体测试过程如下:
1)、启动服务器,直接运行MediaServer即可。
2)、配置rtsp地址,将我们摄像机的rtsp拉流地址配置到服务器,由服务器向IPC拉流,然后通过播放端使用VLC向服务器拉流,也可以使用上节提到的test_player程序拉流。这样不管有多少个播放端,都不需要直接向IPC拉流了,降低了IPC的负载。
3)、VLC拉流。VLC中,媒体->打开网络串流,输入拉流地址rtsp://127.0.0.1/live/test1,点击播放。