档次(Profile)管【允许用哪些工具】,级别(Level)管【能跑多大】。一台设备说【支持 H.264】,其实远不够——必须问清楚是哪一档哪一级。
9.1.3 讲了两层结构,这一节讲 H.264 用哪两个旋钮来描述一台设备的编码能力。
一、档次:允许用哪些工具
同一个 H.264,工具集可以差很多,于是分成了几个档次: Baseline(基线)——只用最基础的工具,不用 B 帧、不用 CABAC,面向低算力设备(早期的手机、会议终端); Main(主要)——加上 B 帧、隔行支持与加权预测; Extended(扩展)——加上码流切换等流媒体特性,实际很少用; High(高)——再加上 8×8 变换与更多帧内预测模式,画质与压缩比最好。 档次越高,能用的工具越多,解码算力要求也越高。
二、级别:允许跑多大
光有档次还不够——同一档工具,跑 720p 与跑 4K 是完全不同的负担。 所以还有级别(Level),用每秒能处理多少宏块来卡上限; 级别同时限制最大帧尺寸(用宏块数表示)与最大每秒宏块数; 它不管用什么工具,只管数据量的规模。 所以一台设备的能力描述必须是【档次 + 级别】的组合,例如 [email protected]、[email protected]。
三、用 1080p 卡一次级别
把 1080p 代进级别的限制里,就能看出这个旋钮有多硬: 一帧 = 1920×1088 = 120×68 = 8160 个宏块; 30 帧/秒 → 244,800 宏块/秒,刚好落在 Level 4.0 的 245,760 上限之内; 60 帧/秒 → 489,600 宏块/秒,超过 4.0/4.1,必须上 Level 4.2; 4K30 → 3840×2160 一帧 32,640 宏块、每秒 979,200,已经超过 5.1 的 983,040 临界。 级别不是【建议】,是硬上限——超了就超出了这个级别能表达的范围。
四、为什么工程上要死磕这两个词
在真实项目里,档次与级别直接决定【这个文件能不能被这台设备放】: 老设备只认 Baseline——你的文件用了 B 帧,它就播不了或者直接黑屏; 硬件解码器按档次与级别设计——超出它支持的范围就只能靠软解,发热掉电立刻上来; 转码参数里第一眼就要看档次级别——VideoToolbox、NVENC、x264 都要求指定; 所以排障的顺序常常是:先看档次,再看级别,最后才怀疑文件损坏。
五、和后面的关系
档次与级别这两个词会在后面继续出现: 第十章的 AAC——音频也有一套档位体系(第 8.5.3 节已经埋了伏笔); 第十一章的 H.265——换成 Profiles/Levels/Tier,多出一个 Tier(层)的概念(第 11.2.1 节); 但底层逻辑完全一样:工具集 与 规模 两个维度,把设备能力切成格子。
六、动手 Demo:档次管【用什么工具】,级别管【能跑多大】
H.264 用两个维度描述编码能力,两个词经常被混着说。
mb = (1920 // 16) * (1088 // 16)
lv = [("3.1", 3600, 108000), ("4.0", 8192, 245760),
("4.1", 8192, 245760), ("4.2", 8704, 522240)]
for name, maxfs, maxmbps in lv:
print("Level %-4s 最大帧 %5d 宏块 每秒 %6d 宏块"
% (name, maxfs, maxmbps))
print("1080p 一帧 %d 宏块;30 fps 需 %d;60 fps 需 %d"
% (mb, mb * 30, mb * 60))
实跑输出:
--------------------------------------------------------------------
档次管【用什么工具】,级别管【能跑多大】
--------------------------------------------------------------------
H.264 用两个维度描述编码能力,两个词经常被混着说。
**档次(Profile)**——允许用哪些工具:
Baseline 只用最基础的工具;Main 加上 B 帧与隔行;
High 再加 8×8 变换与更多预测模式。
**级别(Level)**——允许多大的数据量,用【宏块数】卡上限。
级别 最大帧(宏块) 每秒宏块上限
-----------------------------------------
3.1 3600 108000
4.0 8192 245760
4.1 8192 245760
4.2 8704 522240
5.1 36864 983040
拿 1080p 去卡:**一帧 8160 个宏块**。
30 帧/秒 → **244800 宏块/秒**,刚好落在 **Level 4.0 的上限 245760 之内**;
60 帧/秒 → **489600 宏块/秒**,超过 4.0/4.1,**必须上 Level 4.2**。
**记住这句:档次决定【能不能用这个工具】,级别决定【能开多大码率】。**
1080p 一帧 8160 个宏块:30 帧/秒 → 244,800 宏块/秒,刚好落在 Level 4.0 的上限 245,760 之内; 60 帧/秒 → 489,600 宏块/秒,超过 4.0/4.1,必须上 Level 4.2。 档次决定能不能用这个工具,级别决定能开多大。
30 秒实验
- 用 MediaInfo 看两个视频的档次与级别(写作 [email protected] 这种形式),互相对比。
- 若一个是 Baseline、一个是 High,想想它们在低算力设备上的差别。
常见误区
- 以为【支持 H.264】就够了。必须问档次与级别,否则兼容性无从判断。
- 把档次与级别当成一件事。一个管工具集,一个管规模,两者正交。
- 以为级别只是建议值。它是硬上限,超出就意味着不在该级别的表达能力内。
自测三问(点开对答案)
1. 档次(Profile)决定什么? —— 允许使用哪些编码工具,例如是否支持 B 帧、CABAC。 2. 级别(Level)决定什么? —— 数据量的规模上限,用最大帧宏块数与每秒宏块数表示。 3. 1080p60 需要哪个级别? —— 每秒 489,600 宏块,必须 Level 4.2。- ☐ 下一节(9.1.5 X264与JM)
相关笔记
- X264与JM — 两种实现怎么用这些档次
- 块与宏块 — 宏块数从哪来
- H.26x系列 — H.264 在家族里的位置
- 视频的基础概念 — 分辨率与帧率的基本参数
- 🎬 FFmpeg入门详解 · 索引