FFmpeg之视频压缩基础(三)

873 阅读2分钟

FFmpeg之视频压缩基础(三)

前一节中,我们通过将RGB转为YUV(一般来说YUV420)来降低图像的容量,但是仅仅依靠改变一帧图像的颜色空间来起到视频压缩目标是远远不够的。如:一个长度为1H的1080p的视频,帧率为30f/s,我们来计算一下:1920*1080*1.5*1*30*3600 = 312G。这个结果显然是不符合我们预期的。 如何实现视频压缩,首先理解到压缩的本质:去除视频信号的冗余信息。

  • 数据冗余。例如如空间冗余、时间冗余、结构冗余、信息熵冗余等,即图像的各像素之间存在着很强的相关性。消除这些冗余并不会导致信息损失,属于无损压缩。
  • 视觉冗余。人眼的一些特性比如亮度辨别阈值,视觉阈值,对亮度和色度的敏感度不同,使得在编码的时候引入适量的误差,也不会被察觉出来。可以利用人眼的视觉特性,以一定的客观失真换取数据压缩。这种压缩属于有损压缩。

时间冗余:图像序列中的两幅相邻的图像,后一幅图像与前一幅图像之间有较大的相关性。 消除方法:帧间预测和运动补偿

image.png

空间冗余:数据化图像中某个区域的颜色、亮度、饱和度等相同,则该区域里的像素点数据也是相同的,这样大量的重复像素数据就形成了空间冗余。 消除方法:帧内预测

其他冗余的概念请参考: blog.csdn.net/jiayu510068…

目前一般视频压缩的编码方法使用混合编码,其由三部分构成:

  1. 变换编码:消除图像的帧内冗余。将空间域描述的图像信号变换到频率域,然后对变换后的系数进行编码处理。一般来说,图像在空间上具有较强的相关性,变换到频率域可以实现去相关和能量集中。常用的算法:DCT变换,然后量化。

  2. 熵编码:熵编码是因编码后的平均码长接近信源熵值而得名。熵编码多用可变字长编码(VLC,Variable Length Coding)实现。其基本原理是对信源中出现概率大的符号赋予短码,对于出现概率小的符号赋予长码,从而在统计上获得较短的平均码长。可变字长编码通常有霍夫曼编码、算术编码、游程编码等。

image.png

  1. 运动估计和运动补偿: 运动估计(Motion Estimation)和运动补偿(Motion Compensation)是消除图像序列时间方向相关性的有效手段。

参考雷神的博客!

音视频录制与播放流程:

image.png