背景

  我们的项目是基于sip的IMS系统,需要添加对海康28181摄像头的支持,所以分为以下几步:

  1. 向海康摄像头发起点播请求,基于sip.
  2. PS流过来后,剥出h264流.
  3. 对h264流进行解码.

  一.发起sip请求

  按照GB28181的规范,sip头域必须携带subject字段,to字段必须是摄像头的视频编码通道ID,sdp中s行固定为play,需添加一个a行描述为PS流,sdp中不可携带audio信息,详细可见这里的描述:28181摄像头sip格式

  二.分析PS流结构

  由于之前没有接触过ps流的格式,所以在网上看了下mpeg-2 ps流的介绍,感觉还是模棱两可。突然想起live555是支持mpg文件,所以直接看live555的源码,发现live555中就支持对mpeg-2的解析,同sip终端将拉过来的海康摄像头PS流存文件,用live555进行调试,发现live555解析失败,通过打开日志查看,原来live555中没有对ps system map进行解析,所以当出现这种类型的包时,其认为是video sequence slice包,所以会解析失败。

  live555中有对整个解析过程都有日志打印,并且整个解析代码写的很清晰,通过对解析过程日志的分析,可以得出HK 28181摄像头 PS流的封包格式

     PSheader| PS system header | PS system Map | PES header | h264 raw data

  三.总结

  虽然网上也有很多对海康PS流格式的描述,但是对从来没有接触过的人来说,光看文字描述还是过于抽象。在音视频开发领域,协议和格式是有限的,有很多优秀的开源项目供提供了广泛的支持,对陌生的格式或协议,通过借鉴开源项目,可以加深自己对格式或协议的理解。