前言
在实际项目开发中,遇到这样的一个需求:将用户填入的图片、音频、视频等资源打包上传到服务端。在开发过程中,发现图片、音频、视频会有出现过大的情况,几种资源大小加起来可能两三百兆。这导致上传资源时间拖长,最终上传失败概率增加,影响用户体验。
对于图片资源,大多数在一两兆,偶尔出现四五兆或七八兆的图片,但是图片压缩技术成熟,使用系统提供的稳定 API 就可以将图片压缩到一定的大小范围之内。
对于音视频资源,系统并未有像图片资源压缩的稳定 API 可使用,这就导致压缩音视频资源无从下手。
在网上搜索了大堆音视频压缩的资料,有些过于简单,有些又过于复杂,看完之后,感觉脑袋中对这些信息还是模糊未知。
音视频压缩,并不是通过 API 就能明白,想知道为什么要这样压缩,如何去压缩,得从最基础的知识开始入手。所以便有了这篇文章以及后续的文章。
以下文章的内容,并不是我的原创,只是我个人从书籍中获取的音视频压缩知识的重要摘要。
采样和量化
把光和声音转化成数字。模拟信号数字化以后,模拟信号的无限连续的范围必须缩减到离散的比特和字节的有限范围内。通过采样和量化可以实现这一点。采样谨慎地界定了将要测量的点或区域。量化界定了实际记录的值。
空间采样
采样是把图像分解为离散的碎片,或者说样本,每一个样本标识2D空间中的一个单独的点。大多数网格编解码器采用方形像素,即每个样本的高度和宽度相等。但是,DV 和 ITU-R BT.601 等采集格式通常使用非正方形像素,它们是长方形的。
时间采样
时间采样通常术语 f/s 或 Hz(每秒钟周期)描述。运动通常需要至少 15 f/s才能看起来不像幻灯片,至少24 f/s 用于视频和音频才能显得同步,并且至少 50 f/s 才能让体育等快速运动清晰。
声音采样
视频有两个空间维度(高度和宽度),但是音频只有一个:响度,它本质上是任一给定的时刻的空气压力。所以音频保存为一系列的响度测量值。对响度变化进行采样的频率称为采样率。CD 质量的音频的采样率是 44.1 kHz(每秒44 110次)。另一些常用的采样率包括 22.05 kHz,32 kHz,48 kHz,96 kHz 和 192 kHz(96 kHz 和 192 kHz 主要专用于建档,不用于传送)。消费级音频的传送大部分从未超过 48 kHz。
奈奎斯特频率
对任意信号的采样率至少要两倍于该信号的频率才能准确地再现信号。频率和信号可以是空间的、时间的或者声音的。
量化
把离散的数值指派给每个样本理论上无穷的可能值,这个过程称为量化。我们要说的是,可用数值的范围较宽的量化更精细,而可用数值范围较小的量化更粗糙。不能简单地说精细比粗糙好。更精细的量化需要更多的比特用于处理和存储。所以为了准确捕捉我们在意的范围,需要多思考和测试用于不同类型样本的理想的量化,才不会把比特浪费在大小的、实际上不会产生可看见或可听见的差异的差异上。
比特组合而成为字节,每个字节有8个比特。
量化视频
比特深度(也称为位深、位元深度、像素深度或色彩深度)决定了量化后细节的数量。大多数视频编解码采用每通道8 bit。
Y’CbCr 色彩空间视频系统典型地只采用从 16 到 235 用于典型内容的亮度,而 RGB 色彩空间计算机系统采用整个 0 到 255 的范围。所以 RGB 和 Y’CbCr 都是用 8 bit 数字量化,但是实际上 RGB 的范围有 256 个数值,而 Y’CbCr 的范围是 219 个。
颜色空间
RGB
所有的视频显示设备本质是 RGB 设备。摄像机里的 CCD 是 RGB,然后在 CRT 用红色、绿色和蓝色磷光物质现实,LCD 用三色平面显示,或者在投影设备中用三色光束显示。计算机图像几乎总是以 RGB 生成。所有的数字视频始于 RGB 终于 RGB,虽然几乎从来不以 RGB 存储或传输。
<font color=#FF0000 >RGB 用于影像处理并不理想。亮度是视频很重要的方面,但 RGB 并没有直接编码亮度。相当程度上,亮度是 RGB 值的一项自然出现产物,意思是亮度随着3个通道的相互作用而出现。这使得计算机及其复杂化,因为颜色和亮度不能独立进行调整。提高对比度需要改变每个通道的值。一个简单的色调偏移,需要通过大量的计算对所有3个通道解码和再编码才能实现。 RGB 对压缩效率也没有助益,因为亮度和色度混合在一起。理论上,你可以给蓝色或者红色分配更少的一些样本,但是实际上这么做并不会产生值得损失质量的效率。</font>
RGBA
RGBA 不过是有一个额外用于阿尔法数据的通道的 RGB,它用于内容创建,但是内容并不采用阿尔法通道拍摄或压缩。具有”阿尔法通道支持“的编解码器实际只对视频数据编码,阿尔法通道用于内部的另一套数据。
Y’CbCr
数字视频以称为 Y’CbCr 或 其一变体的形式保存。Y’表示亮度,Cb 表示蓝色减去亮度,而 Cr 表示红色减去亮度。Y 后的 ‘ 是素数,表示这是非线形亮度;记住,这是为了视觉均校正过的伽马,我们并不需要它为了实际的亮度水平而成为线性。
Y’CbCr 方程式: Y’ = 0.299 红色 +0.578 绿色 +0.114 蓝色 Cb = -0.147 红色 -0.289 绿色 +0.436 蓝色 Cr = 0.615 红色 -0.515 绿色 -0.100 蓝色
所以,Y’主要是绿色、一些红色和一点蓝色组成。因为 Cb 和 Cr 都扣出了亮度,都在它们的等式中包含了亮度,它们也都不是纯粹的 B 或 R。但这些等式和人眼的灵敏度匹配,基于此我们可以应用不同的压缩技术。因为我们看到的亮度远超过色度细节,所以把色度从亮度中分离出来,可以让我们对 3 个通道中的两个进行压缩。用 RGB 则不能做到这一点,这就是为什么首先要操心 Y’CbCr。
降低 Y’CbCr 信号数据率的最简单的办法是降低 Cb 和 Cr 通道的分辨率。回到图纸模拟,你可以每两个方块对 Cb 和 Cr 进行一次采样,而对每个方块进行 Y’ 采样。另一个常用的途径-每4个Y’一个Cb和Cr采样,每两个 Y’一个 Cb和Cr采样,等等。
Y’CbCr 采样方程式用 x:y:z 的格式表示。第一个数字确定了对应亮度采样的数量,第二个数字表示从头开始每隔一行上的亮度采样对应的色度采样的数量,第三个 数字表示与另一行上的亮度采样对应的色度采样的数量。所以,4:2:0的意思是对于每四个亮度采样,从顶部开始每隔一样有两个色度采样,而其余的行上没有一个色度采样。
Y’的量化很常规 - 0到255,视觉均匀。颜色的量化则不一样,仍然是8-bit,但是所用的范围是-127到128。如果Cb 和 Cr 都为0,影响是黑白的。值越高于或低于0,颜色越饱和。颜色本身的实际色调由 Cb 对 Cr 的相对量决定。与视频中的 Y 的范围从 16 到235相同,视频中的 Cb 和 Cr 的范围限制在 -112 到 112。
4:4:4 采样
是Y’CbCr 最基本的形式,也是最少见的形式。它对每个 Y 值有一个 Cb 和 一个 Cr。尽管通常不用于存储格式,它有时用于内部处理。相比较而言,RGB 总是4:4:4。
4:4:2 采样
是专业视频创建最常用的二次采样方式:水平方向每两个 Y’ 有一个 Cb 和 一个 Cr。用于磁带格式的 4:2:2 有D1 、数字 Betacam、D5 和 HDCM-SR。它也是大多数编辑系统的标准解码器的原始格式。它看上去良好,对交织视频尤其如此,但是只比 4:4:4 小1/3。
那么,如果4:2:2 产生了 1.5:1 的压缩比,为什么 4:2:2 被称为“未被压缩”呢?这是因为当我们谈论压缩过与未被压缩的时候,我们不考虑采样和量化,就如同 44.1 kHz 采样的音频和以 48 kHz 采样的音频相比,并不称为 “压缩过”。所以我们未被压缩的 4:2:2 编解码器和被压缩的4:2:2 编解码器。
4:2:0 采样
在这里,每个 Y’ 采样一个像素,每个Cb 和 Cr 采样4 个像素(一个 2x2 方块)。在进一步压缩前,它能提供 2:1 的数据下降。4:2:0 是用于压缩逐行扫描视频的理想的颜色空间,并且应用于所有的现代发送编解码器,无论是用于广播、DVD、蓝光或者网络。它也常被称为“YV12”,用以表示样本本局的独特方式。
4:2:0 也用于一些消费级/准专业级的采集格式,包括 PAL DV、HDV 和 AVCHD。
4:1:1 采样
这是 NTSv DV25 格式的颜色空间,包括 DV、DVC、DVCPRO、和 DVCCAM,以及 PAL 中的“ DV CPRO 4:1:1”。4:1:1 对四像素宽和一像素高 Cb 和 Cr 采样。所以它拥有和4:2:0一样数量的色度采样,但是外形不同(不是正方形)。
那么为什么要用4:1:1取代4:2:0呢?因为这是交织视频组成整体的方式。每一帧视频由包含不同的时序信息两场组成。在一行的高度进行色度采样,更容易在两场之间保持颜色一致。但是,每四个水平像素只有一个色度采样会导致一定程度的斑驳或者丢失颜色饱和的边缘的细节。拍摄时用4:1:1没有问题,但是你应当永远不要编码成4:1:1,它只用于采集。
YUV9 采样
YUV-9 是“旧石器时代”的压缩的常用颜色空间,每4x4像素块一个色度采样。和 4: x: x 命名法不同,YUV-9 的名字来自于它的每个像素平均为 9bit(因此4:2:0会是 YUV-12,即 YV12)。4x4 色度二次采样不足以实现非常好的效果,高度饱和图像的清洗边缘看上去极其斑驳。
Lab
Photoshop 的招人喜欢的 Lab 颜色模式是 4:4:4 Y’CbCr 的一种变体。其名称是指亮度L、色度通道 A 和色度通道 B。因为亮度/色度分开用于图片处理和用于视频一样好,所以我已经不的不惊叹不止一个老派的 Photoshop 高手跳到了 Lab 模式,修复了源自 JPEG 文件的色度通道的问题。
文档信息
- 本文作者:Wang Jiang
- 本文链接:https://wjrye.github.io/wiki/2022-12-12-Video-And-Audio-1/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)