最近由于某些原因刚好研究了下GB28181中的音视频封装,秉着事情无论具细都记录下的原则,记录下。
GB28181是公共安全视频监控联网系统信息传输、交换、控制技术要求,最近几年才出来的安防新标准,旨在统一各种摄像头监控设备的各种协议,实现全网接入,既然是公安部出的标准,肯定是非常重要啦,想接入政府部门可能都得实现这个协议。
其音视频封装部分,分为两种:1、对讲类型,2、广播类型;
下面聊聊对讲类型的一些音视频封装,文档中的说明有时给我的感觉并不是很全面。
媒体流:采用PS流的格式,按照ISO/IEC 13818-1标准,先将ES流(也就是原始的编码后的H264或者音频G711格式的数据)都打包成PES。然后将PES打包成PS;这里分为两种,一种是I帧的PS,需要在PS头部添加System header,然后再PES前面添加一个特殊的PES,叫PSM(program stream map),这也是一种PES,比较特殊;
所以对于包含I帧的视频格式就是(注意,这里PESA可以多个,原来的文档写得模棱两可,只有一个PESA)
PS包头 | System header | PSM | PESV | PESA | PESA... |
---|
另外一种是P帧的视频,这种视频不需要添加Sytem header及PSM格式为:
PS包头 | PESV | PESA | PESA... |
---|
将音视频数据打包成上面的格式后,使用RTP封包,封成多个RTP包发送,最后一个包marker位为1。
另外注意音频采样率及通道数要求。
最后通过网络io发送给服务端。
这里还有个问题吐槽,PS流按照这种封装格式,PS流按照文档上的说法主要是在存储比如CD存储中使用,而传输一般使用TS;
这里就需要看MPEG-TS文档中的说明,TS和PS是对PES处理的两个相反的过程,PS将若干个PES打包为一个PS包,而TS将一个PES拆分成多个TS包,每个包大小固定188字节,最后如果不够就填充。PS其实是不利于网络传输的,对于基于UDP的RTP而言,丢包是很正常的,按到里应该采用TS更加合理,但是不明白为什么GB28181采用PS来传输,如果中间丢了一个包,整个PS流都无法还原,而TS丢包只影响一个PES而已。
网友评论