🎬 第四章 音频基础
📄 一句话概括

一次音频编码可以拆成六步,只有第四步【量化】真正丢掉了信息——前面几步都只是换一种看法。

📝 本节和前面几节的关系

4.2.1 讲了为什么要压,这一节讲压的过程具体怎么走。

一、编码不等于压缩

两个词常被混用,但严格说:压缩只是编码里的一环。 编码还要负责把结果组织成标准格式的码流——带帧头、能被打包、能被别的程序读。 所以一次编码走完,既有【丢信息】的步骤,也有【只整理】的步骤。

二、六步流程

① 分帧:把连续采样切成一帧一帧,每帧约 1024 个点。 ② 加窗:让每一帧的两端平滑过渡,避免边界处突变。 ③ 变换:把时域换成频域——看清各频段的能量分布。 ④ 量化:按感知重要性分配比特——听得出多给,听不出少给。 ⑤ 熵编码:把结果再无损压一次。 ⑥ 打包:加帧头、拼成码流,交给容器。

三、只有一步在丢信息

六步里最关键的是第四步【量化】。 前面几步都只是【换一种看法】:分帧是切段,加窗是平滑,变换是换坐标系。 它们都不丢信息,只是让信息变得更适合被取舍。 真正决定【压掉多少、损失多少】的,只有量化这一步。

四、为什么都要先做变换

因为在时域里看不出【哪一段不重要】。 波形上每一处看起来都差不多,你没法说【这里可以少存几位】。 换到频域之后,人耳的敏感曲线就能用上了——低频敏感多给比特,高频不敏感少给。 这就是所有感知编码都要先做变换的原因:先把信息摊开,才有得挑。

五、动手 Demo:一次音频编码走了几步

音频编码的典型流程,可以拆成六步。

steps = [
    ("1 分帧",   "把连续采样切成一帧一帧", "每帧约 1024 点"),
    ("2 加窗",   "让帧两端平滑过渡",       "避免边界突变"),
    ("3 变换",   "时域转频域",             "看清各频段能量"),
    ("4 量化",   "按感知重要性分配比特",   "听得出多给、听不出少给"),
    ("5 熵编码", "把结果再压一次",         "无损压缩"),
    ("6 打包",   "加帧头、拼成码流",       "交给容器"),
]
for a, b, c in steps:
    print("%-9s %-22s %s" % (a, b, c))

实跑输出:

--------------------------------------------------------------------
一次音频编码走了几步
--------------------------------------------------------------------

音频编码的典型流程,可以拆成六步。

  ① 分帧     把连续采样切成一帧一帧          每帧约 1024 点
  ② 加窗     让帧两端平滑过渡             避免边界突变
  ③ 变换     时域转频域                看清各频段能量
  ④ 量化     按感知重要性分配比特           听得出多给、听不出少给
  ⑤ 熵编码    把结果再压一次              无损压缩
  ⑥ 打包     加帧头、拼成码流             交给容器

  六步里最关键的是**第四步【量化】**——
  **前面几步都只是【换一种看法】,只有量化真正丢掉了信息。**

六步里最关键的是第四步【量化】—— 前面几步都只是【换一种看法】,只有量化真正丢掉了信息。

30 秒实验

  1. 对照六步,指出哪几步是无损的、哪一步是有损的。
  2. 想一下:如果跳过第三步变换、直接量化,会失去什么能力。

常见误区

  1. 以为编码就是压缩。编码还包含组织成标准码流这一步。
  2. 以为分帧、加窗也在丢信息。它们是准备步骤,不丢。
自测三问(点开对答案) 1. 音频编码的六步是什么? —— 分帧、加窗、变换、量化、熵编码、打包。 2. 哪一步真正丢掉了信息? —— 量化(第四步)。 3. 为什么要先做时域到频域的变换? —— 只有频域才能看出哪段频率成分对听觉不重要,才好分配比特。

相关笔记