最近做NVR倍速播放的web功能,大致了解了一下这些平台有关倍速播放的时候是如何发送视频数据的。
基本原理如下:
因为这些平台都不会牵扯到编解码,所以只能在编码后的数据进行处理,原始的编码数据来源于相机(大部分),所以对于安防,编码的源头在相机端,这是一个大致前提。
平台收到相机编码后的数据后,如果要进行倍速播放,那怎么发送数据呢?策略如下:
1、4倍以下,按照全帧率4倍码流发送数据,即1s发送100帧(假设25fps),注意这里对dts和pts不做任何修改。
2、4倍以上,只发送I帧数据。这里也不修改dits和pts.
我们收到数据后直接播放会出现什么问题呢?
1、如果我们收到的100fps,但是此时dts和pts却没有改变,播放器播放的时候会出现跳秒和花屏现象。为什么呢?
这是因为dts和pts没有修改,播放器还是按照正常dts和pts速率来解码播放,导致缓存长满,这时候播放器一般会丢包处理,丢包后刚好这一段数据中包含I帧,那么就会出现花屏现象。
2、如果按照只接受I帧来收数据,如果不修改dts和pts就会出现非常严重的卡顿,因为还是按照原来的dts和pts来解码播放。
所以这时候就必须修改dts和pts,同时将编码端的gop调整到25左右,不然,如果gop是50那么2s才会发一帧数据,假设8倍速率,也就是4帧每秒,这可不行,最好设置为gop25,那么8倍就是8帧,16倍就是16帧,凑合着可以看呢。
如果你要对接NVR28181平台的倍速播放功能,就是拉流后对dts和pts进行修改,因为只有P帧(假设相机编码没有B帧),dts=pts。