同一个 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 秒实验
- 在 FFmpeg 里把同一个视频用
-c:v libx264与硬件编码器(如h264_nvenc)各压一次。 - 对比耗时、文件大小与 CPU/GPU 占用,把【三选二】这三个字落到实处。
常见误区
- 以为 JM 是【最好的实现】。它是参考实现,追求正确而不是可用。
- 以为符合标准就一定能压得好。标准留了大量自由度,实现水平决定差异。
- 以为硬件编码器只是【更快的那一个】。它同时也在压缩比上让步。
自测三问(点开对答案)
1. JM 与 x264 的定位分别是什么? —— JM 是官方参考软件,x264 是面向生产的开源实现。 2. 为什么两个实现差距那么大? —— 标准只管码流语法,搜索、模式选择、QP 分配完全自由。 3. 编码器选型是在哪三者之间取舍? —— 速度、画质、码率(压缩比)。- ☐ 下一节(9.2.1 H.264编解码简介)
相关笔记
- 档次与级别 — 实现要遵守的能力边界
- H.264编解码流程 — 实现内部真正在跑什么
- 运动估计和运动补偿 — x264 优化最多的地方
- FFmpeg — libx264 在 FFmpeg 里的位置
- 🎬 FFmpeg入门详解 · 索引