📄 一句话概括
解码不是重做一遍,而是按相反顺序还原每一步——但要注意:反量化不是量化的逆运算,丢掉的细节永远补不回来。
📝 本节和前面几节的关系
5.3.4 讲了编码用到的技术,这一节看整条链路怎么一正一反地走完。
一、编码端的顺序
分块 → 预测 → 变换 → 量化 → 熵编码 → 打包。 注意最后还要【打包】:把码流组织成标准格式,才能被别人读走。 这一步和 5.2 讲的封装不是一回事——这里包的是编码层,那边包的是文件层。
二、解码端的顺序
解析 → 熵解码 → 反量化 → 逆变换 → 重建(含预测)→ 输出。 顺序刚好倒过来,而且预测这一步要重做——因为它必须用和解码器一样的状态。 这也是为什么解码器实现必须严格遵循标准:一处不同,重建就全错。
三、一处关键的不对称
反量化不是量化的逆运算。 量化是把连续的值映射到有限的档位;反量化只能把档位还原成一个代表值。 原始值 103 被量化到 100 那一档,反量化回来仍是 100——那 3 永远回不来了。 这就是所有有损编码的共同特点:误差一旦产生就是永久的。
四、这一节和音频的对照
音频编解码的流程也是【编码正走、解码倒走】。 两者的结构完全一致——因为它们解决的其实是同一个数学问题。 所以理解了视频这条链路,回过去看音频那一章会轻松很多。
五、动手 Demo:编码与解码,一个正走一个倒走
解码不是重做一遍,而是按相反顺序把每一步还原。
rows = [("分块", "解析宏块结构"),
("预测(帧内/帧间)", "用同样的方式重建预测块"),
("变换", "逆变换回像素域"),
("量化", "反量化(丢掉的补不回来)"),
("熵编码", "熵解码还原符号")]
for a, b in rows:
print("%-22s %s" % (a, b))
实跑输出:
--------------------------------------------------------------------
编码与解码,一个正走一个倒走
--------------------------------------------------------------------
解码不是重做一遍,而是**按相反顺序把每一步还原**。
编码端 解码端
-----------------------------------------------
分块 解析宏块结构
预测(帧内/帧间) 用同样的方式重建预测块
变换 逆变换回像素域
量化 反量化(丢掉的补不回来)
熵编码 熵解码还原符号
注意第四行的差别:**反量化不是量化的逆运算**——
量化丢掉的细节**永远补不回来**,只能近似还原。
这就是所有有损编码的共同特点。
注意第四行的差别:反量化不是量化的逆运算—— 量化丢掉的细节永远补不回来,只能近似还原。 这就是所有有损编码的共同特点。
30 秒实验
- 把同一段视频用低码率压两次,比较两次输出的像素值是否完全相同。
- 同参数同源时结果一致,说明编码是确定的——但都不等于原始值。
常见误区
- 以为解码能【还原原画】。有损编码只能近似还原。
- 以为反量化能补回细节。它只是把档位还原成代表值。
自测三问(点开对答案)
1. 编码端与解码端的顺序关系是什么? —— 解码端按相反顺序还原每一步,其中预测要重做。 2. 为什么反量化补不回原来的值? —— 量化已经把它映射到了有限档位,多个原值共用一个代表值。 3. 为什么解码器必须严格遵循标准? —— 重建依赖与编码端完全一致的状态,一处不同就全错。- ☐ 下一节(5.4.1 视频播放器简介)
相关笔记
- 视频编码的关键技术 — 每一步用到的技术
- 音视频的封装 — 打包之后的下一站
- 音频编码 — 结构完全一致的那条链路
- 🎬 FFmpeg入门详解 · 索引