陈颂光
全栈工程师,能够独立开发从解释器到网站和桌面/移动端应用的各类软件。
关注我的 GitHub

理解多媒体编码

与文本相比,图片、音频、视频往往占用较多空间,于是瓶颈常常在传输,为了提高性能通常会进行有损压缩,但人们竟然大多感觉不出损失。

图片

JPEG格式

JPEG是一种有损压缩格式,其大致编码方法为:

  1. 把亮度和两个色度矩阵记为Y、U、V,每个元素占用1字节,其中U、V通过平均降低到只有Y的1/4(由于人对亮度更敏感,这省下一半空间)
  2. 把上述矩阵都分块成8×8的再减去128
  3. 对每个块进行离散余弦变换或小波变换(JPEG2000),由于舍入误差有轻微损失
  4. 把每个系数除以一个量化表中对应位置系数作有损压缩,越高频的系数损失越大
  5. 再用游程编码无损压缩
  6. 再用Huffman编码无损压缩

音频

若声音中最高频率为f,则以2f频率采样已经足够。波形编码使用傅立叶变换之类的变换再拋弃次要系数来实现压缩。但更有效的压缩方法以心理声学模型为基础,由于一些声音可以掩盖其它声音,所以只用编码人类能听出来的频段:

  • 不同频率的可听功率阀值不同
  • 较强的声音会提高相近频段的可听功率阀值,而且该声音消失后可听功率阀值不会马上恢复

MP3

MP3有一些可选的参数:

  • 单声道还是多声道(常用于多种语言的音轨)
  • 立体声各通道分开压缩还是利用通道间冗余
  • 比特率,在信噪低时需要更高的比特率来避免失真

大致编码方法为:

  1. 把样本分组
  2. 分离出若干个波段,测定未屏蔽的频率
  3. 把二进位分配给各波段
  4. 再用Huffman编码无损压缩

视频

在模拟制式中,PAL每秒25帧,共625条扫描线,采用隔行扫描以减低闪烁,用一个亮度信号和两个色度信号实现彩色。

数字视频本质上为一系列图像,由于现代显示器一秒可刷新至少75次,无须隔行扫描。问题在于存储大量图像需要很大的空间(即使每张图像已经经过压缩),基本的解决思路是画面很少出现突变。

MPEG

MPEG的帧分为三类:

  • I帧就是JPEG图像,为了方便快进和倒带、支持中途加入观看广播和在有帧丢失时容错,需要保证周期性地有I帧(如每秒至少一个)
  • P帧就是与前一帧的差异,对于每个块,若发现它由上一帧的一个区域大致相同则只用记录偏移,其余块仍用JPEG编码
  • B帧就是与前一帧和后一帧的差异,这用于背景被短时间遮盖时有压缩效果
关键词 多媒体 编码