现在的视频流有两个非常重要的时间戳,pts和dts,其中pts是显示的时候用,dts在解码的时候用。
pts很好理解,按照pts的顺序以及duration不间断的display就可以了。
dts在解码的时候用,那么这句话怎么理解,解码器需要dts来确认解码顺序吗?
解码器解码顺序有两个:
- 一个是放入解码器中的顺序
- 另一个是解码器中解码的顺序
找个图来说明
如上图,我们经常看到,B帧是双向依赖帧,如上图所示,假设2号B帧解码的时候依赖4号P帧,那么请问:
这个依赖关系是谁告诉解码器的?
这是NAL包内部slice的bh数据来告诉解码器的。
所以解码器本身是不感知dts的,解码器解码时候需要的前后依赖关系也是在压缩数据内部保存的。
但是你把压缩数据送到解码器的时候要保证一个顺序,这个顺序是dts决定的。
也许你还不理解,什么是“把压缩数据送到解码器的时候要保证一个顺序”?,假设上面的压缩数据块就像扑克一样,洗牌后,你要排序,然后把它们放入到解码器,那么排序的规则是什么?这就是dts.
特别是网络包UDP的时候,压缩数据包来的前后顺序会乱序,这个时候就要根据dts来决定送入解码器的先后顺序。