理解音视频 PTS 和 DTS

视频

视频的播放过程能够简单理解为一帧一帧的画面按照时间顺序呈现出来的过程,就像在一个本子的每一页画上画,而后快速翻动的感受。html

image

可是在实际应用中,并非每一帧都是完整的画面,由于若是每一帧画面都是完整的图片,那么一个视频的体积就会很大,这样对于网络传输或者视频数据存储来讲成本过高,因此一般会对视频流中的一部分画面进行压缩(编码)处理。因为压缩处理的方式不一样,视频中的画面帧就分为了避免同的类别,其中包括:I 帧、P 帧、B 帧。网络

I、P、B 帧

I 帧、P 帧、B 帧的区别在于:ide

  • I 帧(Intra coded frames):I 帧图像采用帧内编码方式,即只利用了单帧图像内的空间相关性,而没有利用时间相关性。I 帧使用帧内压缩,不使用运动补偿,因为 I 帧不依赖其它帧,因此是随机存取的入点,同时是解码的基准帧。I 帧主要用于接收机的初始化和信道的获取,以及节目的切换和插入,I 帧图像的压缩倍数相对较低。I 帧图像是周期性出如今图像序列中的,出现频率可由编码器选择。
  • P 帧(Predicted frames):P 帧和 B 帧图像采用帧间编码方式,即同时利用了空间和时间上的相关性。P 帧图像只采用前向时间预测,能够提升压缩效率和图像质量。P 帧图像中能够包含帧内编码的部分,即 P 帧中的每个宏块能够是前向预测,也能够是帧内编码。
  • B 帧(Bi-directional predicted frames):B 帧图像采用双向时间预测,能够大大提升压缩倍数。值得注意的是,因为 B 帧图像采用了将来帧做为参考,所以 MPEG-2 编码码流中图像帧的传输顺序和显示顺序是不一样的。

也就是说,一个 I 帧能够不依赖其余帧就解码出一幅完整的图像,而 P 帧、B 帧不行。P 帧须要依赖视频流中排在它前面的帧才能解码出图像。B 帧则须要依赖视频流中排在它前面或后面的帧才能解码出图像。编码

这就带来一个问题:在视频流中,先到来的 B 帧没法当即解码,须要等待它依赖的后面的 I、P 帧先解码完成,这样一来播放时间与解码时间不一致了,顺序打乱了,那这些帧该如何播放呢?这时就须要咱们来了解另外两个概念:DTS 和 PTS。.net

DTS、PTS 的概念

DTS、PTS 的概念以下所述:code

  • DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在何时解码这一帧的数据。
  • PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在何时显示这一帧的数据。

须要注意的是:虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。视频

当视频流中没有 B 帧时,一般 DTS 和 PTS 的顺序是一致的。但若是有 B 帧时,就回到了咱们前面说的问题:解码顺序和播放顺序不一致了。htm

好比一个视频中,帧的显示顺序是:I B B P,如今咱们须要在解码 B 帧时知道 P 帧中信息,所以这几帧在视频流中的顺序多是:I P B B,这时候就体现出每帧都有 DTS 和 PTS 的做用了。DTS 告诉咱们该按什么顺序解码这几帧图像,PTS 告诉咱们该按什么顺序显示这几帧图像。顺序大概以下:blog

PTS: 1 4 2 3
   DTS: 1 2 3 4
Stream: I P B B

音视频的同步

上面说了视频帧、DTS、PTS 相关的概念。咱们都知道在一个媒体流中,除了视频之外,一般还包括音频。音频的播放,也有 DTS、PTS 的概念,可是音频没有相似视频中 B 帧,不须要双向预测,因此音频帧的 DTS、PTS 顺序是一致的。图片

音频视频混合在一块儿播放,就呈现了咱们经常看到的广义的视频。在音视频一块儿播放的时候,咱们一般须要面临一个问题:怎么去同步它们,以避免出现画不对声的状况。

要实现音视频同步,一般须要选择一个参考时钟,参考时钟上的时间是线性递增的,编码音视频流时依据参考时钟上的时间给每帧数据打上时间戳。在播放时,读取数据帧上的时间戳,同时参考当前参考时钟上的时间来安排播放。这里的说的时间戳就是咱们前面说的 PTS。实践中,咱们能够选择:同步视频到音频、同步音频到视频、同步音频和视频到外部时钟。

参考

相关文章
相关标签/搜索