第四章 HDR视频的编码与封装

好,咱们进入第四章。前面聊了HDR的采集、处理、显示,那中间这段——视频怎么存、怎么传,其实是个大坑。我当年第一次做HDR项目时,就栽在编码和封装上。明明拍出来效果惊艳,一编码全糊了。后来才明白,HDR视频的编码,跟普通SDR完全是两码事。

4.1 主流编码格式:H.265/HEVC 与 AV1

先说编码。HDR视频的数据量比SDR大得多。为什么?因为色深更高(10bit起步)、分辨率更高(4K/8K)、动态范围更宽。你想想看,同样的画面,HDR要记录的信息量可能是SDR的2-3倍。所以编码格式的选择,直接决定了你的视频能不能在带宽有限的情况下保持画质。

H.265/HEVC:目前的主流选择

H.265,也叫HEVC,是H.264的继任者。我个人习惯叫它HEVC,因为更准确。它最大的特点就是压缩效率高——比H.264提升约50%。什么意思?同样的画质,码率可以砍一半。

但HEVC对HDR的支持,才是关键。它内置了HDR的编码工具:

  • 10bit色深支持:这是HDR的基础。8bit根本没法看,色带会非常明显。
  • 高动态范围量化:HEVC的量化器针对高亮度区域做了优化,不会把高光细节压没了。
  • SCC(屏幕内容编码):如果你做的是短视频,里面可能有文字、UI元素,SCC能大幅提升压缩效率。
我的经验: 在短视频平台,HEVC的编码参数我建议用"medium"预设,再配合"crf=18"。这个组合在画质和文件大小之间比较平衡。crf低于16,文件会大得离谱;高于22,HDR的高光细节就开始丢失了。

AV1:未来的方向

AV1是后起之秀。它由开放媒体联盟(AOM)推出,目标是替代HEVC。为什么?因为HEVC的专利授权太复杂了,你懂的。

AV1的压缩效率比HEVC再提升约30%。但代价是编码速度慢——慢很多。我记得第一次用AV1编码一段4K HDR视频,花了整整8个小时。HEVC同样的内容,40分钟搞定。

不过AV1对HDR的支持很完整:

  • 10bit/12bit色深:原生支持,不需要额外配置。
  • HDR10+元数据传递:AV1的元数据通道设计得更灵活。
  • 自适应量化:根据画面内容动态调整量化参数,对HDR的高光区域特别友好。
注意: 目前大多数短视频平台对AV1的支持还不够完善。如果你做的是面向大众的短视频,建议先用HEVC。AV1更适合那些你能控制播放器环境的场景,比如自己的App。

4.2 HDR元数据:SMPTE ST 2086、CLL、FALL

编码搞定了,但还有个关键问题:播放器怎么知道你的视频是HDR?亮度范围是多少?这就靠元数据了。

HDR元数据,说白了就是给播放器看的说明书。它告诉播放器:这个视频的亮度峰值是多少、平均亮度是多少、色域范围是什么。没有这些信息,播放器就只能瞎猜,结果就是画面要么过曝,要么死黑。

SMPTE ST 2086:主元数据

这是最基础的HDR元数据。它包含:

  • 显示主色度:红、绿、蓝三原色的坐标。
  • 白点色度:白色的坐标。
  • 最大亮度:内容中出现的最高亮度值。
  • 最小亮度:内容中出现的最低亮度值。

这些信息是静态的,整段视频只有一个值。所以它也叫"静态元数据"。

CLL(Content Light Level):内容亮度等级

CLL包含两个关键指标:

  • MaxCLL(最大内容亮度):视频中所有像素的最大亮度值。
  • MaxFALL(最大帧平均亮度):所有帧的平均亮度的最大值。

这两个值有什么用?举个例子。你拍了一段HDR视频,里面有烟花爆炸的瞬间,亮度可能达到10000尼特。但整段视频的平均亮度可能只有200尼特。MaxCLL告诉播放器:嘿,我这里有超高亮度的画面,你得准备好。MaxFALL则告诉播放器:整体上,这个视频的亮度水平是怎样的。

关键点: MaxCLL和MaxFALL是动态元数据,它们可以逐帧变化。但大多数编码器只生成一个全局值。我建议你在编码前,用工具分析一下视频的亮度分布,手动设置这两个值,效果会更好。

FALL(Frame Average Light Level):帧平均亮度

FALL是MaxFALL的基础。它计算每一帧的平均亮度。为什么重要?因为播放器可以根据FALL来调整背光亮度。如果一段视频的FALL很低(比如夜景),播放器可以降低背光,省电的同时还能提升对比度。

嗯,这里要注意:FALL不是元数据标准的一部分,但很多专业工具会用它来辅助分析。

4.3 封装容器:MP4 与 MKV

编码和元数据都有了,最后一步就是封装。封装容器就像是一个盒子,把视频流、音频流、元数据、字幕等所有东西装在一起。

MP4:最通用的选择

MP4是短视频的标配。几乎所有平台、所有设备都支持。它的结构简单,兼容性好。

但MP4对HDR元数据的支持有限:

  • 支持HDR10静态元数据:SMPTE ST 2086可以嵌入。
  • 不支持HDR10+动态元数据:MP4的容器规范没有为动态元数据预留位置。
  • 不支持杜比视界:杜比视界的元数据需要特殊的容器结构。

所以,如果你做的是HDR10短视频,MP4完全够用。但如果是HDR10+或杜比视界,就得考虑其他容器了。

MKV:更灵活的选择

MKV是一个开放容器,它的灵活性远超MP4。你可以把任何类型的元数据塞进去,包括动态元数据、多语言字幕、章节信息等。

MKV对HDR的支持:

  • 支持所有HDR格式:HDR10、HDR10+、杜比视界都可以。
  • 支持多音轨:可以同时包含5.1声道和立体声。
  • 支持章节:适合长视频。

但MKV也有缺点:兼容性不如MP4。很多短视频平台不支持MKV上传。所以我的建议是:

  • 上传到平台:用MP4。
  • 本地存档或分发:用MKV。
我的习惯: 编码时先用MKV保存所有元数据,最后再转封装成MP4。这样既保留了完整信息,又保证了兼容性。转封装不会损失画质,只是换个盒子而已。

4.4 知识体系图

下面这张图,帮你理清HDR编码与封装的整体逻辑:

HDR视频编码与封装知识体系 HDR原始视频 编码格式选择 H.265/HEVC AV1 HDR元数据嵌入 SMPTE ST 2086 CLL (MaxCLL/MaxFALL) FALL 封装容器选择 MP4 MKV

这张图展示了HDR视频从原始素材到最终成品的完整流程。编码、元数据、封装,三个环节缺一不可。任何一个环节出问题,最终效果都会打折扣。

4.5 避坑指南

最后,分享几个我踩过的坑:

  • 编码时忘记设置10bit:默认是8bit,出来的HDR视频全是色带。我曾经因为这个被客户骂了一顿。
  • 元数据丢失:转封装时,有些工具会丢弃元数据。记得用ffmpeg -map_metadata 0保留所有元数据。
  • 码率给得太低:HDR视频的码率需求比SDR高30%-50%。别用SDR的参数去套HDR。
重要提醒: 编码HDR视频时,一定要用10bit编码器。8bit编码器会丢失大量亮度信息,导致画面出现明显的色带和亮度断层。这是新手最容易犯的错误。

好了,第四章就到这里。编码和封装是HDR视频的骨架,骨架搭好了,后面的调色、分发才能顺利进行。下一章我们聊聊HDR视频的调色与后期处理,那才是真正出效果的地方。


公众号:蓝海资料掘金营,微信deep3321