HDR视频

1,037 阅读4分钟

HDR(high dunamic range,高动态范围)与之相对的是SDR(standard dynamic range,标准动态范围)。

HDR主要的三种标准

1. Dolby Vision

Dolby Vision(中文名:杜比视界)是美国杜比实验室推出的影像画质技术,通过提升亮度、扩展动态范围来提升影像效果。它可以提升视频信号保真度,从而让图像的无论从亮度、色彩还是对比度角度看都非常逼真。也是采用 PQ 广电转换函数。

2. HLG

HLG的全称是Hybrid Log Gamma(混合对数伽马),它是由英国BBC和日本NHK电视台联合开发的高动态范围HDR的一个标准。HLG不需要元数据,能后向兼容SDR,相比HDR10,它的画面即使在现有的SDR显示设备上,也能呈现得更加艳丽动人。

3. HDR 10

HDR10,2015年8月27日,美国消费电子协会公布的hdr10媒体档案,俗称hdr10,使用建议2020色彩空间,Perceptual Quantizer(PQ),和10位的位深度。hdr10是由各种各样的公司支持。

HLG 的输出不带元素数据,其编码值是相对值,按照百分比进行。 最大照度值=显示设备的技术指标,因此 HLG 可以根据不同的显示设备显示出不同   程度的 HDR 效果,具备自适应性能。

HDR10和Dolby Vision都是PQ绝对值显示,PQ 的输出带元数据,其编码值是绝对亮度值。其输出可以有很多版本,比如 500nit,1000nit,2000nit 等等。如果显示设备没有达到输出版本的亮度要求,则高亮部分会被切掉。

1、真正的HDR究竟是什么呢?以技术定义而言,HDR遵循自己独有的一套光电转换机制,即光信号与电信号之间的转换。

2、HDR可以带来更宽广的动态范围,那么HDR与SDR的不同之处在哪里?首先还是技术方面,两者的伽马曲线不同。伽马曲线定义了影像系统中光线辉度的一种非线性变化。SDR与HDR使用了不同的伽玛曲线,这决定了我们在看HDR片源,能够看到更多的亮度信息。那么最终表现在实际效果上时,HDR就拥有更高的色深、更广的动态范围和更强的色彩表现力。但因为HDR与SDR两个不同的伽玛曲线,所以也造成了两者在相互兼容性上的问题存在。

3、虽然HDR10是第一个达到普世目的的HDR标准,但它却不是第一个HDR标准,Dolby Vision才是。有趣的是,Dolby Vision与HDR10基于同一套HDR机制,结果却“分道扬镳”走了完全不同的两条路。

整个视频是统一的元数据,就叫静态HDR,比如HDR10;

不同场景有不同元数据,就称为动态元数据,杜比视界(ST2094-40)和HDR10+(ST2094-10)就属于动态元数据;

HLG没有元数据。

编码HDR

在iOS端如果想编码出HDR视频,videotoolbox需要以下配置:

VTCompressionSessionCreate...
VTSessionSetProperty(m_session, kVTCompressionPropertyKey_TransferFunction, kCMFormatDescriptionTransferFunction_ITU_R_2100_HLG);
VTSessionSetProperty(m_session, kVTCompressionPropertyKey_ColorPrimaries, kCMFormatDescriptionColorPrimaries_ITU_R_2020);
VTSessionSetProperty(m_session, kVTCompressionPropertyKey_YCbCrMatrix, kCMFormatDescriptionYCbCrMatrix_ITU_R_2020);

解码HDR

iOS端,使用videotoolbox解码时需要以下配置。 这三个参数来自 developer.apple.com/news/?id=rw… 里面介绍导出HDR视频时需要设置的参数。如果忘了设置,则解码画面偏白,并且解码后的YCbCrMatrix为默认的ITU_R_709_2。

CFMutableDictionaryRef extensions = CFDictionaryCreateMutable(**NULL**, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(extensions, kCMFormatDescriptionExtension_ColorPrimaries, kCMFormatDescriptionColorPrimaries_ITU_R_2020);
CFDictionarySetValue(extensions, kCMFormatDescriptionExtension_TransferFunction, kCMFormatDescriptionTransferFunction_ITU_R_2100_HLG);
CFDictionarySetValue(extensions, kCMFormatDescriptionExtension_YCbCrMatrix, kCMFormatDescriptionYCbCrMatrix_ITU_R_2020);
status = CMVideoFormatDescriptionCreate(NULL, codecType, width, height, extensions, &formatDescriptionOut);

iOS端,使用AVAssetReaderTrackOutput解码时,不需要vtb那些配置,只需要检测到是HDR,指定outputSettings的pixel format即可

outputSettings = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange)};

Android端,使用Mediacodec解码时,不需要配置color range、color transfer、color primaries。因为这些参数都在SPS中,只是VTB可能比较谨慎吧。

渲染HDR

iOS端

  1. 使用AVSampleBufferDisplayLayer,有高亮效果。
  2. 使用CAMetalLayer,并设置 wantsExtendedDynamicRangeContent 为 YES,有高亮效果。(iOS16后新增)

参考:文章 文章1

编辑HDR

未完待续