视频编码
-
相较于音频数据,视频数据有极强的相关性,也就是说有大量的冗余信息,包括空间上的冗余信息和时间上的冗余信息。
-
IPB帧
视频压缩中,每帧都代表着一幅静止的图像。而在进行实际压缩时,会采取各种算法以减少数据的容量,其中IPB帧就是最常见的一种。- I帧:帧内编码帧(intra picture),I帧通常是每个GOP(MPEG所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,作为随机访问的参考点,可以当成静态图像。I帧可以看作一个图像经过压缩后的产物,I帧压缩可以得到6:1的压缩比而不会产生任何可觉察的模糊现象。I帧压缩可去掉视频的空间冗余信息,下面即将介绍的P帧和B帧是为了去掉时间冗余信息。
- P帧:前向预测编码帧(predictive-frame),通过将图像序列中前面已编码帧的时间冗余信息充分去除来压缩传输数据量的编码图像,也称为预测帧。
- B帧:双向预测内插编码帧(bi-directional interpolated prediction frame),既考虑源图像序列前面的已编码帧,又顾及源图像序列后面的已编码帧之间的时间冗余信息,来压缩传输数据量的编码图像,也称为双向预测帧。
基于上面的定义,我们可以从解码的角度来理解IPB帧。I帧自身可以通过视频解压算法解压成一张单独的完整视频画面,所以I帧去掉的是视频帧在空间维度上的冗余信息。
P帧需要参考其前面的一个I帧或者P帧来解码成一张完整的视频画面。
B帧则需要参考其前一个I帧或者P帧及其后面的一个P帧来生成一张完整的视频画面,所以P帧与B帧去掉的是视频帧在时间维度上的冗余信息。
-
IDR帧与I帧的理解
在H264的概念中有一个帧称为IDR帧,那么IDR帧与I帧的区别是什么呢?首先来看一下IDR的英文全称instantaneous decoding refresh picture,因为H264采用了多帧预测,所以I帧之后的P帧有可能会参考I帧之前的帧,这就使得在随机访问的时候不能以找到I帧作为参考条件,因为即使找到I帧,I帧之后的帧还是有可能解析不出来,而IDR帧就是一种特殊的I帧,即这一帧之后的所有参考帧只会参考到这个IDR帧,而不会再参考前面的帧。在解码器中,一旦收到一个IDR帧,就会立即清理参考帧缓冲区,并将IDR帧作为被参考的帧。 -
PTS与DTS
DTS主要用于视频的解码,英文全称是Decoding Time Stamp,PTS主要用于在解码阶段进行视频的同步和输出,全称是Presentation Time Stamp。在没有B帧的情况下,DTS和PTS的输出顺序是一样的。因为B帧打乱了解码和显示的顺序,所以一旦存在B帧,PTS与DTS势必就会不同.
-
GOP的概念
两个I帧之间形成的一组图片,就是GOP(Group Of Picture)的概念。通常在为编码器设置参数的时候,必须要设置gop_size的值,其代表的是两个I帧之间的帧数目。前面已经讲解过,一个GOP中容量最大的帧就是I帧,所以相对来讲**,gop_size设置得越大,整个画面的质量就会越好**,但是在解码端必须从接收到的第一个I帧开始才可以正确解码出原始图像,否则会无法正确解码(这也是前面提到的I帧可以作为随机访问的帧)。在提高视频质量的技巧中,还有个技巧是多使用B帧,一般来说,I的压缩率是7(与JPG差不多),P是20,B可以达到50,可见使用B帧能节省大量空间,节省出来的空间可以用来更多地保存I帧,这样就能在相同的码率下提供更好的画质。所以我们要根据不同的业务场景,适当地设置gop_size的大小,以得到更高质量的视频。