视频

视频传输原理

视频是由一幅幅帧图像和一组音频构成的,视频的播放过程可以简单理解为一帧帧的画面按照时间顺序呈现出来的过程。但是在实际应用中,并不是每一帧都是完整的画面,因为如果每一帧画面都是完整的图片,那么一个视频的体积就会很大。这样对于网络传输或者视频数据存储来说成本太高,所以通常会对视频流中的一部分画面进行压缩(编码)处理。
编码器将多张图像进行编码后生产成一段一段的 GOP ( Group of Pictures ) 如下图, 解码器在播放时则是读取一段一段的 GOP 进行解码后读取画面再渲染显示。GOP (Group of Pictures) 是一组连续的画面,由一个 I 帧和数个 B / P 帧组成,是视频图像编码器和解码器存取的基本单位,它的排列顺序将会一直重复到影像结束。
视频中的 I 帧,P 帧,B 帧 - 图1
由于压缩处理的方式不同,视频中的画面帧就分为了不同的类别,其中包括:I 帧、P 帧、B 帧。I 帧是内部编码帧(也称为关键帧),P 帧是前向预测帧(前向参考帧),B 帧是双向内插帧(双向参考帧)。简单地讲,I 帧是一个完整的画面,而 P 帧和 B 帧记录的是相对于 I 帧的变化。如果没有 I 帧,P 帧和 B 帧就无法解码。

I 帧

I 帧(Intra coded frames):I 帧图像采用帧内编码方式,即只利用了单帧图像内的空间相关性,而没有利用时间相关性。由于 I 帧不依赖其它帧,所以是随机存取的入点,同时是解码的基准帧。
I 帧主要用于视频播放的初始化,I 帧图像的压缩倍数相对较低。I 帧图像是周期性出现在图像序列中的,出现频率可由编码器选择。在视频画面播放过程中,如果 I 帧丢失了,则后面的 P 帧也就随着解不出来,就会出现视频画面黑屏或卡顿的现象。

P 帧

P 帧(Predictive-coded frames)前向预测编码图像帧:P 帧采用帧间编码方式,即同时利用了空间和时间上的相关性。P 帧图像只采用前向时间预测,可以提高压缩效率和图像质量。P 帧是差别帧,P 帧没有完整画面数据,只有与前一帧的画面差别的数据。
若 P 帧丢失了,则视频画面会出现花屏、马赛克等现象。

B 帧

B 帧(Bi-directional predicted frames),B 帧图像采用双向时间预测,可以大大提高压缩倍数。值得注意的是,由于 B 帧图像采用了未来帧作为参考,因此 MPEG-2 编码码流中图像帧的传输顺序和显示顺序是不同的。
这就带来一个问题:在视频流中,先到来的 B 帧无法立即解码,需要等待它依赖的后面的 I、P 帧先解码完成,这样一来播放时间与解码时间不一致了,顺序打乱了,那这些帧该如何播放呢?这时就需要来了解另外两个概念:DTS 和 PTS。

DTS 和 PTS

DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
DTS 和 PTS 都是在编码的时候由编码器生成的。
比如上图的 GOP,他的采集顺序是 IBBBP,那显示顺序 PTS 也是

  1. I B B B P
  2. PTS: 12345

编码器的编码顺序是:

  1. I P B B B
  2. DTS: 12345
  3. PTS: 15234

推流顺序也是按编码顺序,即:

  1. I P B B B
  2. DTS: 12345
  3. PTS: 15234

接收端接收的视频流也是 IPBBB。
解码也是按接收到的视频流去解,接收一帧解码一帧,解码顺序:

  1. IPBBB

而解码顺序和显示顺序不同,需要按 PTS 重新调整解码后的帧,即:

  1. I B B B P
  2. PTS: 12345
  3. DTS: 13452

另外音频的播放,也有 DTS、PTS 的概念,但是音频没有类似视频中 B 帧,不需要双向预测,所以音频帧的 DTS、PTS 顺序是一致的。