一、概述
设备使用GB28181协议对接海康平台时,发现音频和视频存在卡顿现象,不是一直卡顿,有时候卡有时候不卡,但是卡顿的时候音视频一起卡顿。
从2016版国标文档上可以看出,要求携带者音视频数据,并且对音视频数据还是有要求的,出现这种卡顿的问题肯定是上传的音视频流数据出现了问题。后面我们测试发现,只发送视频帧,不发送音频帧是正常的,视频画面很流畅,无卡顿现象,当时分析着可能跟发送的音频帧有关。
二、问题分析
1、设备对比分析
找到了海康设备和宇视设备进行对比,同时接入到海康平台上两个厂家的音频和视频都是正常的,音视频也非常流畅,没有卡顿现象。后面又分别使用tcp进行拉流测试,因为海康平台默认是udp传输流,tcp模式下,我们的设备也是一样卡顿,从这次设备对比分析中确定了我们的设备的确是存在着问题。
2、抓包对比分析
抓取了海康和宇视两个厂家设备的报文,从sip信令开始分析,我们设备发送的sip信令报文和另外两个厂家发送的基本上一致,只是海康平台下发invite的sdp中没有携带y=字段,也就是没有要求ssrc值,这个感觉问题不大,至少设备发送的音视频流中是有的,尽管是自己定义的ssrc值。
上面是从sip信令中对比分析的,接下来就是分析音视频流的打包区别,GB28181协议中,要求使用rtp+ps+h264的格式进行打包,导致音视频卡顿的问题,也有可能是打包格式不一样导致的,导致客户端解码时出现了问题。使用wireshark工具抓取了海康设备、宇视设备和我们设备的音视频流数据进行对比,从打包格式中并没有发现异常,一时有点头大,不知道问题在哪里了。
经过一段时间的摸排,发现音频时间戳增量不一样,也就是ps流中和rtp头中协议的时间戳不一样,海康设备音频时间戳和视频时间戳是一样的,我们的设备也是这样,音频时间戳使用的是视频的时间戳,
宇视设备的报文跟海康的是不一样的,音频时间戳是独立的,不依赖与视频的时间戳,这也让我找到了突破口,海康设备可能不具有借鉴的意义,因为平台就是海康的嘛
3、验证分析结果
将音频时间戳独立开,使用底层传递上来的音频时间戳进行封装报文,需要注意的是,rtp头中携带了时间戳,在ps header中也有时间戳,需要同时修改。修改后,设备对接海康平台音视频正常,不再有卡顿的现象。
三、总结
经验和知识同等重要,主要是对gb28181打包音视频方式不大了解,通过这次问题分析,又学到了不少。
四、讨论
这里再问给大家一个问题,在使用gb28181传输音视频流时,使用的音频如果没有时间戳怎么办?那应该怎么设置时间戳呢?先别着急看答案,答案也不一定唯一,大家可以思考一下。。。
我思考的答案:
这种情况需要知道音频编码参数,音频采样率、帧率信息,比如音频格式为G711A,采样率为8000,每次采样8比特,即一个字节。
帧率即每秒打多少包,假设c毫秒打一包,帧率即:1000ms/Xms,
时间戳增量=8000/(1000/X)=8X;
假设X=40ms,则计算出时间戳增量为320;
这种配置下,每包的数据大小:8000(X/1000)=8*X;
当X=40时,结果为320;
也就是说,G711A时间戳增量和包数据大小是相同的。
相信大家也想到了好的解决办法!