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

档次(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 秒实验

  1. 用 MediaInfo 看两个视频的档次与级别(写作 [email protected] 这种形式),互相对比。
  2. 若一个是 Baseline、一个是 High,想想它们在低算力设备上的差别。

常见误区

  1. 以为【支持 H.264】就够了。必须问档次与级别,否则兼容性无从判断。
  2. 把档次与级别当成一件事。一个管工具集,一个管规模,两者正交。
  3. 以为级别只是建议值。它是硬上限,超出就意味着不在该级别的表达能力内。
自测三问(点开对答案) 1. 档次(Profile)决定什么? —— 允许使用哪些编码工具,例如是否支持 B 帧、CABAC。 2. 级别(Level)决定什么? —— 数据量的规模上限,用最大帧宏块数与每秒宏块数表示。 3. 1080p60 需要哪个级别? —— 每秒 489,600 宏块,必须 Level 4.2。

相关笔记