视频的播放过程能够简单理解为一帧一帧的画面按照时间顺序呈现出来的过程,就像在一个本子的每一页画上画,而后快速翻动的感受。html
可是在实际应用中,并非每一帧都是完整的画面,由于若是每一帧画面都是完整的图片,那么一个视频的体积就会很大,这样对于网络传输或者视频数据存储来讲成本过高,因此一般会对视频流中的一部分画面进行压缩(编码)处理。因为压缩处理的方式不一样,视频中的画面帧就分为了避免同的类别,其中包括:I 帧、P 帧、B 帧。网络
I 帧、P 帧、B 帧的区别在于:ide
也就是说,一个 I 帧能够不依赖其余帧就解码出一幅完整的图像,而 P 帧、B 帧不行。P 帧须要依赖视频流中排在它前面的帧才能解码出图像。B 帧则须要依赖视频流中排在它前面或后面的帧才能解码出图像。编码
这就带来一个问题:在视频流中,先到来的 B 帧没法当即解码,须要等待它依赖的后面的 I、P 帧先解码完成,这样一来播放时间与解码时间不一致了,顺序打乱了,那这些帧该如何播放呢?这时就须要咱们来了解另外两个概念:DTS 和 PTS。.net
DTS、PTS 的概念以下所述:code
须要注意的是:虽然 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。实践中,咱们能够选择:同步视频到音频、同步音频到视频、同步音频和视频到外部时钟。