需求描述
目前项目中,公网有大量的IPC摄像头以及NVR,品牌基本上是HIK和UNV,对于这类设备,需求如下
- 需要获取设备的状态,播放视频、未来可能还有保存视频的需求。
- 业务系统播放视频,无需OCX插件,支持移动端播放。
厂商的方案
对于需求,厂商有一些方案,举例如下:
- 海康有萤石云,使用了下,感觉做的不错,就是免费只能2个通道,收费方案包括接入设备数量以及流量的要求的付费。试用了下感觉不错,除了收费其他都挺好。
- 服务端设备的方案,如海康有8700,UNV也有类似的VMS平台,原理大概是让摄像头请求平台,然后摄像头在公网打洞,告诉平台自己打洞的地址端口,平台去拉流的方案。
- 直连摄像头,rtsp拉流,这种方案比较适合局域网内。
这里要说一句,我觉得为啥这几个大的厂商,不能再摄像头内部集成rtmp推流的方案吗?是涉及到协议有版权还是啥,不然也没这么多麻烦事情了
民间方案
民间有一些收费的方案,如LIVEGBS之类的,价格大概100路1W块钱,绑定硬件设备,使用的应该是GB28181的国标方案,研究了下协议,觉得方案是可行的。确定了方向。
我的方案
确定了方向后,参考了网上大量的资料,最后决定按下图进行
- 信令服务部分主要是GB28181协议定义的内容,比较简单,未来这里规划增加给业务系统调用的接口。
- 收流转码服务需要启动一个UDP端口,接受摄像头的RTP推流,获取其中的h264rawdata, 然后转码推送给流媒体服务器 ,这一步耗费了我大量的时间
- 流媒体服务器使用开源的,如NGINX-RTMP
信令服务 GB28181协议
协议网上能下载到,主要通过摄像头或NVR配置GB28181平台的方式,摄像头主动上送请求,服务端下发指令,摄像头推流的方式。
本身协议内容很多,还分好多级,看起来有点晕,本质上我们只需要完成注册,keeplive,invite play ,bye几个指令就行,还有一些扩展的控制云台,播放录像的有精力再说吧。这个还是比较简单的,无非是指令的对接,网上有几个开源的项目,参考一下很快能搞定。
注意下有个小坑
- IPC和NVR的invite 指令,由于NVR有多个视频通道,所以NVR的invite指令一定需要有subject,内容是视频通道的ID和内容编号,这个内容编号我一直没理解是什么意思,网上有部分说还有头部request-line也需要设置为视频编通道编号(如下),我这边用UNV的NVR测试不需要,HIK暂时没有测试。
Request-Line: INVITE sip:34020000001180000002@3402000000 SIP/2.0
- BYE指令,一定要和invite指令时的callid和tag保持一致,否则摄像头返回没有对应的事物
信令服务部分总的来说比较简单,耗费我大量时间的在收流,处理,转码上,下面再说。
未完待续…