开源项目地址(未完成)
https://github.com/comahqs/mdfactory
项目主要需求如下:
1、GB28181设备接入
2、实现视频流转文件或视频流(例如RTSP)
3、实现视频流转GB28181
项目使用pjsip库实现GB28181设备接入,网上也有很多例子,但都不是很完整,导致我绕了好多弯路。pjsip启动监听的流程都类似,网上也有很多,大家可以看源码。注册注销流程、心跳流程也都好理解,主要问题是在发起INVITE请求方面,在函数server_sip::start_play中就模拟了SIP服务器主动发起实时视频请求流程。目前代码只处理了h264,所以记得将摄像头的格式调整为h264,另外我这边测试直连的时候都有udp丢包现象,所以最好先降低视频流码率。
打包sdp信息发送给摄像头后,交互流程pjsip已经处理好了,你只要在pjsip_inv_usage_init注册的对应回调里处理剩余逻辑就可以了。网上一般建议在on_media_update回调里开启rtp接收并发送回应包。这里将GB28181协议的sip服务器和媒体服务器整合到一起,减少交互流程。
通过pjmedia_transport_udp_create创建rtp监听,pjmedia_transport_attach绑定数据回调,pjmedia_transport_media_start启动监听流程,最后那个启动一定要有,我就在这停了好久,网上有些代码没有这个启动。
在rtp回调里通过pjmedia_rtp_decode_rtp剥离rtp协议,剩下的就是你需要的数据了,一般摄像头只支持ps格式,需要手动剥离ps协议。
PS解码
PS格式数据包分两种,一种是由SPS、PPS和帧数据的包,SPS记录了视频流的相关信息,可以认为这种包是关键包;另一种是只有帧数据的包。一个数据帧很大,但RTP包长度有限,所以一般一个数据帧会分割成多个包,按顺序发给对方。
关键包开头结构如下

本文介绍了如何使用pjsip库实现GB28181设备接入,包括视频流转文件、RTSP流以及GB28181协议的交互流程。在处理PS格式数据包时,解析了关键包和普通包的结构,并详细说明了如何剥离PS头获取视频数据。同时,文章提到了摄像头格式调整为h264的必要性以及UDP丢包问题的应对策略。

7688

被折叠的 条评论
为什么被折叠?



