🎬 第九章 H.264编解码基础
📄 一句话概括

同一个 H.264 标准下有两个最有名的实现:JM 是【看得懂的实现】、x264 是【用得上的实现】——标准不规定实现,实现决定成品质量。

📝 本节和前面几节的关系

9.1.4 讲了档次与级别,这一节看是谁把这些参数真正用起来——两种参考实现。

一、JM:官方参考软件

JM(Joint Model)是 H.264 的官方参考软件,由标准组织维护: 定位是【把标准讲清楚】——它的代码几乎逐条对应标准文本; 追求正确与完整,而不是速度; 因此它慢到只能当验证工具——某些配置下压一段视频要花几十倍的时间; 它的价值在于:判一个码流合不合法,看它认不认。 想读懂标准文本,对着 JM 的代码看是最快的一条路。

二、x264:开源工程实现

x264 是从零写的开源实现,目标是在生产环境里真的能用: 算法优化——菱形/六边形快速搜索、多参考帧的裁剪、帧内模式选择的提前终止; 指令级优化——大量 SIMD 汇编,把关键循环压到极限; 工程优化——多线程、切片并行、lookahead 前瞻; 结果是它比 JM 快几个数量级,而压缩比还更好。 这也说明:同一份标准下,【怎么选】比【能不能选】更值钱。

三、为什么实现能差这么多

差别的根源在于标准【留了多大的自由度】: 标准只规定码流的语法——哪些信息怎么写、怎么才算合法; 标准不管搜索算法、模式选择、QP 分配(第 8.2 节); 于是 JM 选【最直白地照做】,x264 选【最聪明地近似】; 两者产出的码流互相兼容,画质与速度却可以差出好几倍。 所以评价编码器不能只看【符不符合标准】,要看它把自由度用得多好。

四、实际工作里怎么用这两个名字

落到日常操作上,这两个名字出现的场景完全不同: x264——ffmpeg 里的 libx264 就是它,日常转码、压制、录屏全是它在干活; JM——做标准验证、教学、分析码流语法时才会用; 还有第三类:硬件编码器(NVENC、VideoToolbox 等),速度最快、压缩比与画质最差; 所以选编码器其实就是选一个点:速度、画质、码率,三选二。

五、从这一节看整章的结构

9.1 这一段的五节到这里收尾,回看一下它们的顺序: 9.1.1 技术——有哪些工具; 9.1.2 句法元素——这些工具的结果怎么写进码流; 9.1.3 VCL 与 NAL——怎么适配网络传输; 9.1.4 档次与级别——设备能力的两个维度; 9.1.5 两种实现——谁把这些真正做出来。 接下来 9.2 钻进编码器内部,看这些技术具体怎么落地。

六、动手 Demo:两种 H.264 实现的分工

同一个标准下面,有两个最有名的实现,定位完全不同。

rows = [("JM", "官方参考软件", "正确、完整", "标准验证与教学"),
        ("x264", "开源工程实现", "快、压得小", "实际生产与转码")]
for name, pos, goal, use in rows:
    print("%-5s %-12s %-12s %s" % (name, pos, goal, use))

实跑输出:

--------------------------------------------------------------------
两种 H.264 实现的分工
--------------------------------------------------------------------

同一个标准下面,有两个最有名的实现,定位完全不同。

  实现     定位             追求           典型用途
  --------------------------------------------------------
  JM       官方参考软件     正确、完整     标准验证与教学
  x264     开源工程实现     快、压得小     实际生产与转码

  **JM 是【看得懂的实现】,x264 是【用得上的实现】。**
  JM 为了把标准讲清楚,几乎不做优化,**速度慢到只能当验证工具**;
  x264 则把搜索算法、SIMD、多线程全都优化到极致,**在更快的速度下还能给出更好的画质**。
  这也说明一件事:**标准定得再细,实现的自由度依然决定成品质量。**

JM 是【看得懂的实现】,x264 是【用得上的实现】。 JM 为把标准讲清楚几乎不做优化;x264 把搜索、SIMD、多线程都优化到极致。 标准定得再细,实现的自由度依然决定成品质量。

30 秒实验

  1. 在 FFmpeg 里把同一个视频用 -c:v libx264 与硬件编码器(如 h264_nvenc)各压一次。
  2. 对比耗时、文件大小与 CPU/GPU 占用,把【三选二】这三个字落到实处。

常见误区

  1. 以为 JM 是【最好的实现】。它是参考实现,追求正确而不是可用。
  2. 以为符合标准就一定能压得好。标准留了大量自由度,实现水平决定差异。
  3. 以为硬件编码器只是【更快的那一个】。它同时也在压缩比上让步。
自测三问(点开对答案) 1. JM 与 x264 的定位分别是什么? —— JM 是官方参考软件,x264 是面向生产的开源实现。 2. 为什么两个实现差距那么大? —— 标准只管码流语法,搜索、模式选择、QP 分配完全自由。 3. 编码器选型是在哪三者之间取舍? —— 速度、画质、码率(压缩比)。

相关笔记