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