🎬 第五章 视频基础
📄 一句话概括

解码不是重做一遍,而是按相反顺序还原每一步——但要注意:反量化不是量化的逆运算,丢掉的细节永远补不回来。

📝 本节和前面几节的关系

5.3.4 讲了编码用到的技术,这一节看整条链路怎么一正一反地走完。

一、编码端的顺序

分块 → 预测 → 变换 → 量化 → 熵编码 → 打包。 注意最后还要【打包】:把码流组织成标准格式,才能被别人读走。 这一步和 5.2 讲的封装不是一回事——这里包的是编码层,那边包的是文件层。

二、解码端的顺序

解析 → 熵解码 → 反量化 → 逆变换 → 重建(含预测)→ 输出。 顺序刚好倒过来,而且预测这一步要重做——因为它必须用和解码器一样的状态。 这也是为什么解码器实现必须严格遵循标准:一处不同,重建就全错。

三、一处关键的不对称

反量化不是量化的逆运算。 量化是把连续的值映射到有限的档位;反量化只能把档位还原成一个代表值。 原始值 103 被量化到 100 那一档,反量化回来仍是 100——那 3 永远回不来了。 这就是所有有损编码的共同特点:误差一旦产生就是永久的。

四、这一节和音频的对照

音频编解码的流程也是【编码正走、解码倒走】。 两者的结构完全一致——因为它们解决的其实是同一个数学问题。 所以理解了视频这条链路,回过去看音频那一章会轻松很多。

五、动手 Demo:编码与解码,一个正走一个倒走

解码不是重做一遍,而是按相反顺序把每一步还原。

rows = [("分块", "解析宏块结构"),
        ("预测(帧内/帧间)", "用同样的方式重建预测块"),
        ("变换", "逆变换回像素域"),
        ("量化", "反量化(丢掉的补不回来)"),
        ("熵编码", "熵解码还原符号")]
for a, b in rows:
    print("%-22s %s" % (a, b))

实跑输出:

--------------------------------------------------------------------
编码与解码,一个正走一个倒走
--------------------------------------------------------------------

解码不是重做一遍,而是**按相反顺序把每一步还原**。

  编码端                解码端
  -----------------------------------------------
  分块                  解析宏块结构
  预测(帧内/帧间)     用同样的方式重建预测块
  变换                  逆变换回像素域
  量化                  反量化(丢掉的补不回来)
  熵编码                熵解码还原符号

  注意第四行的差别:**反量化不是量化的逆运算**——
  量化丢掉的细节**永远补不回来**,只能近似还原。
  这就是所有有损编码的共同特点。

注意第四行的差别:反量化不是量化的逆运算—— 量化丢掉的细节永远补不回来,只能近似还原。 这就是所有有损编码的共同特点。

30 秒实验

  1. 把同一段视频用低码率压两次,比较两次输出的像素值是否完全相同。
  2. 同参数同源时结果一致,说明编码是确定的——但都不等于原始值。

常见误区

  1. 以为解码能【还原原画】。有损编码只能近似还原。
  2. 以为反量化能补回细节。它只是把档位还原成代表值。
自测三问(点开对答案) 1. 编码端与解码端的顺序关系是什么? —— 解码端按相反顺序还原每一步,其中预测要重做。 2. 为什么反量化补不回原来的值? —— 量化已经把它映射到了有限档位,多个原值共用一个代表值。 3. 为什么解码器必须严格遵循标准? —— 重建依赖与编码端完全一致的状态,一处不同就全错。

相关笔记