这篇文章主要是想聊聊metadata,但是在这之前好像我得简要介绍一下HDR技术。
高动态范围成像(英语:High Dynamic Range Imaging,简称HDRI或HDR),在计算机图形学与电影摄影术中,是用来实现比普通数位图像技术更大曝光动态范围(即更大的明暗差别)的一组技术。高动态范围成像的目的就是要正确地表示真实世界中从太阳光直射到最暗的阴影这样大的范围亮度(即高动态范围)。
高动态范围成像最初只用于纯粹由计算机生成的图像。之后又开发出一些从不同曝光范围照片中生成高动态范围图像的方法。随着数字相机的日渐流行以及桌面软件变得易于使用,许多业余摄影师使用高动态范围成像的方法生成高动态范围场景的照片,但是,实际上高动态范围还有许多其它的应用。
超高清电视论坛(Ultra HD Forum)也将HDR技术列为UHD电视标准需要支持的技术之一[1]。目前,电视与移动端使用的HDR技术标准主要包括:HDR10,HDR10+,Dolby Vision以及HLG(Hybrid Log-Gamma)等。这些技术标准中定义了相比于传统标准动态范围图像(SDR)更大的亮度范围,更广的色域,更大的比特深度,不同于伽马校正的转换函数以及新的编码方式。
说这么多,整个图片瞅瞅:

在将高动态范围图像通过色调映射生成用于显示的低动态范围图像的过程中,通过调整曝光展示了高动态范围图像。中间的曝光是所期望的曝光,也最有可能是场景正常显示的效果。左侧较暗图像使用光圈4曝光,只能显示天空较亮云彩的一些细节。右侧较亮图像使用光圈3曝光,可以显示场景中较暗的部分。
内容来自:wikipedia
可以把HDR图像想象成一个装了很多水的杯子,而LDR图像是一个小一点的杯子。
HDR能装下更多的水(更亮的亮度信息),但倒进小杯子(转换成LDR)时,多出来的水(过亮的区域)只能被倒掉(裁切掉)。
就像拍照时晃动相机,如果物体本身很亮(比如车灯),HDR处理会让拖影更亮更真实;而LDR处理会让拖影灰蒙蒙的,因为亮度信息早就被裁掉了。
到咱们的主题metadata
从功能上来说,HDR的元数据是来帮助显示设备以更好的方式来显示画面内容。从内容和作用范围上来看,可以分为静态元数据和动态元数据。
1.静态元数据
所谓静态元数据,就是一段视频中采用同样的元数据,去控制每一帧画面的色彩与细节,在帧之间并不会变化。
静态元数据包括3大部分的内容,第一部分是用于视频内容母版制作的显示器的色彩容积信息( 颜色空间、白点及最大最小亮度范围) ,这部分内容是在SMPTE ST 2086标准中定义的。

因为H265视频编码标准是支持HDR静态元数据的,在H265标准SEI里面,有这部分对应的语法元素,叫做Mastering display colour volume,如下所示:

相应地,在x265开源视频编码器软件中对应的参数如下:

静态元数据的第二部分是Maximum content light level (MaxCLL),它表示的是整段视频所有帧里面,最亮的像素点的光亮度。
静态元数据的第三部分是Maximum Frame-Average Light Level (MaxFALL),它表示的是整段视频里面,最亮的帧的平均光亮度。
MaxCLL和MaxFALL在H265标准里面对应的SEI语法是Content light level information SEI message syntax,如下图所示:

相应地,在x265视频编码器里面对应的参数是--max-cll,如下所示:

苹果公司支持的HEVC和HDR10使用静态元数据的格式如下:

在我们日常生活能看到的视频里,通常每当发生场景变化的时候,帧里面像素点对应的光亮度和颜色范围也会相应发生变化。此时在进行色调映射tone mapping的时候,如果只是基于静态元数据,显然是不能自适应这种视频内容的变化,导致视频显示的人眼主观视觉感受下降。
2.动态元数据
此时,使用动态元数据的思路更加合适。所谓的动态元数据,就是允许为每一帧或者每一个场景切换指定元数据。动态元数据对应的标准是2016年的SMPTE ST 2094。它有4个不同的应用版本(不同公司和组织的不同方案),如下图所示:
在H265视频编码标准中,动态元数据语法对应的标准是ST 2094-30,具体实现也是通过SEI语法元素来编码,如下所示:
我们知道,目前HDR技术可细分为HDR10,HDR10+,杜比视界和HLG。但需要注意的是,使用PQ曲线(见SMPTEST 2084标准)的HDR10是采用静态元数据的,而杜比公司提出来的杜比视界和三星提出来的HDR10+,尽管也使用了PQ曲线,但他们用的是动态元数据,此外,HLG它是没有元数据的。
苹果公司支持的HEVC和杜比视界格式如下:

HDR元数据在兼容显示SDR视频时的差异,如下图所示:

总结
HDR设置和传输元数据metadata的目的,是想告诉视频使用者额外一些该视频的特性和信息,比如说画面的峰值亮度是多少。
当某个显示器不支持这么高的峰值亮度时(比如HDR内容在SDR显示器上显示),就需要考虑该如何合理恰当的做tone mapping色调映射,从而使不同内容的画面可以正常显示,而不至于出现过曝或其他画面问题。
来自知乎:codec2021
最后讲讲Tone Mapping。
色调映射(Tone Mapping)本质上是一种"亮度压缩算法"------它的作用是把HDR图像中超高的亮度范围和丰富的细节,"压缩"到普通显示器(如SDR显示器)能显示的有限亮度范围内,同时尽量保留画面中关键细节和视觉观感的合理性。
想象你有一张HDR照片,它记录的光线范围就像一座高山(最高亮度可能是太阳的10000尼特),而你的SDR显示器只是一座小土坡(最高亮度可能只有300尼特)。
直接暴力压缩(比如按比例缩小亮度)会导致:高山被压成土坡时,山顶(最亮部分)被压扁成一片死白,山谷(暗部)被拉成一片死黑,中间细节全丢。
色调映射的作用,就是在这座"高山"上找到哪些细节最重要(比如人脸、灯光、云层纹理),然后像修路一样,把关键区域的坡度调整到适合"小土坡"的高度,同时尽量保持山体的自然形态。
这就像把一篇万字长文缩写成千字短文,既要删减,又要保留核心思想------本质上是一种创作,没有唯一正确答案。