Back
Featured image of post FFmpeg 入门与实践 003 - 通用压缩方法及音频压缩

FFmpeg 入门与实践 003 - 通用压缩方法及音频压缩

FFmpeg 系列文章的第三篇。本文旨在深入讲解音视频文件压缩细节。

FFmpeg 系列文章导航页

上一篇 FFmpeg 入门与实践 002

压缩

可以用压缩比 \(r\) 描述压缩性能:

\[ r = \frac{B_0}{B} \]

其中,\(B_0\) 为压缩后平均比特率,\(B\) 为压缩前平均比特率。

对于无损压缩,理论最低的平均比特率为源信号的熵(Entropy)。以 \(H\) 代表源信号的熵,可得:

\[ R = B_0 - H \]

\(R\)统计学冗余Statistical Redundancy),即,统计学意义上,编码器处理原始信号所产生的冗余。

这个式子不难理解,熵的信息学定义是整个系统的平均信息量,若信息量的定义为 \(-\log_2x\)(即系数为 \(-1\)\(\log\) 底数为 \(2\)),那么信息量的单位,就是 \(\text{Bit}\)。同时,熵的单位也为 \(\text{Bit}\)。自然,\(B_0\) 就能和 \(H\) 相运算。

而无损压缩的终极目标,就是使 \(R=0\),亦即 \(B_0 = H\)

因为无损压缩并不丢失信息,所以,压缩率 \(r\) 十分有限。如果 \(r\) 能达到 \(2:1\),已经是相当高的水准了。

无损压缩示意

同时,有损压缩还会丢失人类不可查觉的信息,即知觉不相关信息Perceptual Irrelevance),进一步提高压缩比。下图中的量化 Quantization 即指这一过程(这只是一个抽象描述,是一种过度简化,实际过程更复杂)。

有损压缩示意

量化

去除知觉不相关的基本方法是量化(Quantization),即以较低精度表示源信号样本。例如,整数值 \(1000\),在二进制下储存它需要 \(10 \, \text{Bit}\)。如果用量化步长为 \(9\) 的量化器(SQScalar Quantizer)处理,可得:

\[ 1,000 \div 9 \approx 111 \]

现在,它只需要 \(7 \, \text{Bit}\)。同时,在解码时,可以被重构为:

\[ 111 \times = 999 \]

量化误差(Quantization Error)为:

\[ 1,000 - 999 = 1 \]

试想一下,有 \(1,000\) 个这样的数据。影响是很大的。这一步的压缩比 \(r\) 能达到 \(10:7\).

同时,因为量化误差,有损压缩是不可逆的。通过合理调整量化步长,可以降低量化误差。

以上仅为最简单的一种量化,实际情况要复杂得多。

熵编码

熵编码是最常用的无损压缩方法。是去除统计学冗余的常用方法。Huffman 编码、算术编码都是熵编码。几乎所有现代通用无损压缩算法,例如 zip、LZMA、rar、bzip2 等,都要么基于 Huffman 编码,或是参考其理论。

熵编码的核心思想是建立字典,用短编码表示经常出现的值。

根据 Shannon 信源编码定理,一个符号最佳码长为 \(- \log_bP\),其中 \(b\) 其中是码的数目,\(P\) 是输入符号出现的概率。也就是说,出现概率越高,就应使用更短的编码

以下图为例:

样本概率熵编码
\(0\)\(1/2\)\(1\)
\(1\)\(1/4\)\(01\)
\(2\)\(1/8\)\(001\)
\(3\)\(1/8\)\(0001\)

本表列出了 4 个样本,和对应的出现概率。假设我们表示一个样本需要 \(2 \, \text{Bit}\)。则用熵编码表示的平均比特率为:

\[ 1 \times \frac{1}{2} + 2 \times \frac{1}{4} + 3 \times \frac{1}{8} + 4 \times \frac{1}{8} = 1.875 \, \text{Bit} \]

压缩比 \(r\)\(2:1.875\).

当然,以上方法也不是最佳的。它仅考虑单数编码。诸如 Huffman 编码的方法更为高级。

数据建模

信号基本上都具有强相关性,它们的内部结构能过通过数据模型来表达。以下图为例:

1000 Hz 的正弦信号,以 16 位 PCM 表示,采样率为 48 kHz(上),它的线性预测误差信号(中),及其 DFT 频谱 (下)

对于音频,可以通过线性预测(Linear Prediciton)移除相关性。\(x(n)\) 为第 \(n\) 个正弦信号的采样,\(\hat{x}(n)\) 是预测值。最简单的方式是将前一个采样,作为当前采样的预测:

\[ \hat{x}(n) = x(n-1) \]

这确实是一种预测,但不是一个优雅的实现。所以,这是它的「预测误差」,或曰「残差」(Prediction Error, aka Residual):

\[ e(n)=x(n)-\hat{x}(n) \]

如上图中间所示,如果我们使用处理后的信号,而非原始信号。解码器得到了一个相较而言非常小的数,这一过程显著降低了动态范围。准确而言,动态范围是 \([-4278, 4278]\) 可以用 \(14 \, \text{Bit}\) PCM 表示。压缩率 \(r\)\(16:14\).

另一个去相关性的做法是正交变换Orthogonal Transforms)。如上图下方所示,该图描绘了对数幅度的离散傅里叶变换DFTDiscrete Fourier Transform)。不在时域中处理周期性出现的,正弦信号的大样本值;而在频域中处理少量的大 DFT 系数,其余的都接近于零。于是,可以根据 DFT 系数各自的大小,动态分配比特。此举压缩效果显著。

DFT 在实践中很少使用,因为 DFT 将实数域变换到复数域。对于一个由 \(N\) 个实数输入样本组成的块,DFT 产生由 \(N\) 个复数系数组成的块。它由 \(N\) 个实数和 \(N\) 个虚数系数组成。离散余弦变换DCTDiscrete Cosine Transforms),是实数到实数的变换。DCT 用于替代 DFT。对于 \(N\),可以称其为块大小(block size)或块长度(block length)

当块被独立编码时,块边界会出现块效应,即不连续现象。在音频中,会出现咔嚓声;在图像中,则会出现正方形小块。

可以看到,在 JPEG Q=10 压缩后,有严重的块效应:

建议点此下载后本地放大查看

左:原图;右:JPEG 压缩 Q=10
放大

为了克服块效应,可以使用重叠变换overlapped transform),这是子带滤波器subband filter)的一种。

然而,重叠变换消耗更多的资源。为了减轻消耗,通常在实践中使用 CMFB(余弦调制滤波器组,cosine modulated filter banks) 和 MDCT(修改的DCT,modified discrete cosine transform).

知觉模型

虽然数据模型可以在一定程度上提高压缩率,然而其功能有限。知觉模型就这样出现了。

音频

在音频下,可以使用心理声学模型,安全地去除知觉不相关信息。但人耳感觉不到失真。具体而言,人耳具有以下限制:

  1. 高频限制(High Frequency Limit),人耳理论可听范围为 \(20 \, \text{Hz}\)\(20\,\text{kHz}\)。然而,随着年龄增长,很多成年人已然听不出 \(16 \, \text{kHz}\) 以上的声音了。所以,很多压缩会直接裁切掉 \(20 \, \text{kHz}\) 以上的高频。
  2. 绝对听阈(ATHAbsolute Threshold of Hearing),对不同频率,人耳的听阈都有所不同。ISO 226:2003 规定了一条听阈曲线。
基于 ISO 226:2003 绘制,横轴为对数级的频率(Hz),纵轴为声压级(dB)。其中 phon 为主观声音响度,基于 1 kHz 下的听阈曲线定义。

Wikimedia 作者 Lindosland 已进入公有领域

  1. 时间遮蔽(Temporal Masking)。
  2. 频谱遮蔽(Spectral Masking),例如,声音在 \(2\, \text{kHz}\) 上响度很高,那么 \(2.1 \, \text{kHz}\) 处的低响度声音,往往就会被掩盖。

联合通道编码

该技术如字面意思一样,仅适用于音频。在低码率下,该技术使用广泛。

因为音频的声道往往是协调且同步的,相关性非常强。虽然现有的方法仍然很原始。仅仅使用和差分编码sum/difference coding)和联合强度编码joint intensity coding)。

例如在 HE-AAC v2 中使用的参量立体声PSParametric Stereo),就运用了该技术。

比特率分配机制

需要一种优化的比特分配机制,使得质量最优。

常用的分配机制有以下几种:

  • CQPConstant QP) CQP 是容易实现的一种策略,QP 即质量参数,也就是量化步长。它既不面向码率,又不面向质量。一般很少使用。
  • CBRConstant Bit Rate) CBR,即恒定码率。也是一种相当简单的编码策略。如字面意思,码率是恒定的,不考虑内容。即使是一段什么声音都没有的音频,或全是黑色的视频,如果给了高参数,那么文件也会非常之大。
  • ABRAverage Bit Rate) ABR,即恒定平均码率。可以理解为 CBR 和 VBR 的折中方案。根据场景动态分配的同时,又不超过设定的区间。
  • VBRVariable Bit Rate) VBR,即可变码率。它根据场景动态分配,但无法指定码率范围。
    • 2PASS VBR 的另一种编码模式,即对同一媒体编码两次,第一次区分复杂和简单场景,第二次视频平均码率不变。效果通常比 ABR 更好。
  • CRFConstant Rate Factor) CRF,即恒定码率系数。将视觉输出作为目标。需要输入的是预期质量。是面向质量的策略。

一般,在音频中只使用 CBR、ABR、VBR。而视频几乎都有使用。

本次主要讲了音频和一些通用的压缩方法。下一篇文章将会详细描述视频相关的。

下一篇 FFmpeg 入门与实践 004 - 视频压缩

主要参考

  • You Y. Audio Coding: Theory and Applications[M]. Springer Science & Business Media, 2010. ISBN 9781441917539
comments powered by Disqus