📄 一句话概括
一次音频编码可以拆成六步,只有第四步【量化】真正丢掉了信息——前面几步都只是换一种看法。
📝 本节和前面几节的关系
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. 哪一步真正丢掉了信息? —— 量化(第四步)。 3. 为什么要先做时域到频域的变换? —— 只有频域才能看出哪段频率成分对听觉不重要,才好分配比特。- ☐ 下一节(4.2.3 音频编码基本手段)
相关笔记
- 音频编码基本手段 — 这六步里用到的手段
- 音频压缩 — 为什么要走这一趟
- FLV简介 — 编码结果最后装进哪里
- 🎬 FFmpeg入门详解 · 索引