HDR介绍

发布于:2025-07-29 ⋅ 阅读:(19) ⋅ 点赞:(0)

参考:
https://zhuanlan.zhihu.com/p/524890604
https://juejin.cn/post/7101560813282361352
https://github.com/quietvoid/hdr10plus_tool

HDR(高动态范围)内容的编码格式与视频编码标准紧密相关,主要依赖于主流的视频编码标准(如H.265/HEVC、H.266/VVC等),并通过特定的参数配置(如色域、位深、元数据)实现HDR特性。以下是支持HDR的主要编码格式及相关标准:

一、核心视频编码标准(支持HDR的基础)

HDR内容的编码本质上是在传统视频编码标准中加入HDR特有的参数(如宽色域、高位深),主流编码格式包括:

1. H.265/HEVC(高效视频编码)
  • 地位:目前应用最广泛的HDR编码格式,几乎所有HDR内容(如流媒体、UHD蓝光)均支持。
  • HDR适配:通过扩展参数支持HDR的核心特性:
    • 位深:支持10位或12位色深(SDR通常为8位),能呈现更多亮度层级,避免明暗过渡的色带问题。
    • 色域:支持BT.2020广色域(SDR多为BT.709),包含更丰富的色彩。
    • 元数据:可嵌入HDR动态元数据(如HDR10+、Dolby Vision)或静态元数据(如基础HDR10)。
  • 应用场景:UHD蓝光、Netflix/Disney+等流媒体的HDR内容、游戏画面录制。
2. H.266/VVC(多功能视频编码)
  • 地位:HEVC的继任者,压缩效率更高(比HEVC提升约50%),是未来HDR内容的主流编码方向。
  • HDR适配:原生支持10/12位色深、BT.2020色域,以及更灵活的元数据嵌入方式,对HDR动态元数据(如Dolby Vision)的兼容性更优。
  • 应用场景:8K HDR视频、高带宽需求的HDR内容(如专业影视制作)。
3. AV1(开放媒体联盟编码)
  • 地位:开源、免专利费的编码格式,近年快速崛起,尤其在流媒体领域。
  • HDR适配:原生支持10/12位色深、BT.2020色域,以及HDR10、HDR10+等元数据标准,压缩效率接近VVC。
  • 应用场景:YouTube、Netflix等流媒体的HDR内容,兼顾成本与性能。
4. MPEG-2(较少用于HDR,但兼容)
  • 地位:传统编码格式,压缩效率较低。
  • HDR适配:部分早期HDR广播电视内容(如日本的NHK 8K HDR)使用,但因带宽限制,应用极少。

二、HDR特有的编码扩展标准(与编码格式绑定)

除了基础编码格式,HDR还需通过特定的“编码扩展标准”定义元数据、色域映射等细节,常见的有:

1. HDR10(基于HEVC/AV1等)
  • 编码依赖:无专属编码,基于HEVC、AV1等编码格式,通过静态元数据(如全片峰值亮度)和参数配置实现。
  • 核心参数:10位色深、BT.2020色域、SMPTE ST 2084电光转换函数(OETF)。
2. HDR10+(动态元数据扩展)
  • 编码依赖:基于HEVC或AV1,扩展支持动态元数据(逐帧/逐场景更新亮度参数)。
  • 标准:遵循SMPTE ST 2094-40动态元数据规范,需编码时嵌入实时亮度信息。
3. Dolby Vision(闭源标准)
  • 编码依赖:主要基于HEVC(也支持AV1、VVC),采用闭源的动态元数据格式。
  • 特性:支持12位色深、最高10000 nit亮度,元数据通过专用字段嵌入编码流,需授权解码。
4. HLG(混合对数伽马,适合广播)
  • 编码依赖:基于HEVC或MPEG-2,无需元数据,兼容SDR和HDR显示。
  • 应用:主要用于广播电视(如BBC、NHK的HDR频道),编码时采用BT.2020色域和HLG电光转换函数。

三、编码与HDR标准的对应关系

不同HDR标准对编码格式的支持如下表:

HDR标准 支持的编码格式 核心特性 应用场景
HDR10 HEVC、AV1、VVC 静态元数据,10位色深 流媒体、UHD蓝光
HDR10+ HEVC、AV1 动态元数据,逐帧亮度调整 三星设备、亚马逊Prime
Dolby Vision HEVC、AV1、VVC 动态元数据,12位色深,高亮度 Netflix、Disney+、高端设备
HLG HEVC、MPEG-2 无元数据,兼容SDR/HDR 广播电视、直播

总结

HDR内容的编码以HEVC(H.265) 为基础,AV1 为新兴趋势,VVC(H.266) 为未来方向。具体编码格式需结合HDR标准(如HDR10+/Dolby Vision),通过高位深(10/12位)、宽色域(BT.2020)和元数据嵌入实现HDR特性。解码时,设备需同时支持编码格式和对应的HDR标准才能正确渲染。

HDR10只要求提供静态元数据,只需要获取影像最高峰值亮度来确定整个影像的动态范围。杜比视觉和HDR10+则采用获取动态元数据,这能使中央处理器能够在逐帧或某一段影像场景应用色调映射

HDR动态元数据(HDR Dynamic Metadata)的存储位置取决于具体的内容格式传输/存储场景,通常与视频流绑定,但以独立于像素数据的方式嵌入或关联,主要有以下几种常见形式:

动态元数据保存在哪里

1. 嵌入在视频容器文件中

大多数主流的视频容器格式(如MP4、MKV、TS等)会专门预留留字段用于存储HDR动态元数据的字段,与视频流、音频流等并行存在。

  • 示例
    • 在MP4容器中,HDR10+元数据通常嵌入在mdat(媒体数据)或meta(元数据)盒子中,通过特定的子盒子(如hvcCcolr或自定义扩展字段)标识。
    • 在MKV容器中,元数据可能以“附加数据块”(Attachment)或“标签”(Tag)形式存在,与视频轨道关联。
    • 在TS(Transport Stream)容器中,元数据可能通过私有数据流(PES包)与视频帧同步传输。

2. 与视频帧绑定(逐帧/逐场景关联)

动态元数据的核心是“动态”,需要与对应的视频帧或场景绑定,因此通常会记录元数据生效的时间戳帧索引,确保显示设备能在正确的时刻应用元数据。

  • 例如,Dolby Vision的元数据会与每帧视频数据关联,存储在视频流的扩展数据区(如HEVC编码的VPS/SPS/PPS参数集扩展中)。
  • HDR10+的元数据可能按“场景”划分,每个场景的元数据会标记对应的帧范围(如从第100帧到第500帧)。

3. 独立的元数据文件(后期制作/分发场景)

在专业影视后期制作或内容分发阶段,动态元数据可能会以独立文件形式存在,与视频文件分开管理,最终在封装阶段嵌入容器。

  • 常见格式
    • 杜比的*.dv文件:包含Dolby Vision逐帧元数据。
    • HDR10+的*.json*.h265附属文件:记录场景亮度参数和帧范围映射。

4. 传输协议中的元数据通道

在流媒体传输(如在线视频、直播)中,动态元数据可能通过专用的数据通道与视频流同步传输,而非预先嵌入文件。

  • 例如,通过HLS(HTTP Live Streaming)或DASH协议传输时,元数据可能作为“媒体片段”的附属信息,随视频切片一起发送,确保实时渲染时的同步性。

总结

HDR动态元数据的存储遵循“与视频内容关联但物理分离”的原则:

  • 最终用户接触的视频文件(如MP4、MKV)中,元数据通常嵌入在容器的专用字段中,与视频流绑定。
  • 专业场景中可能以独立文件存在,在封装或传输时与视频关联。
  • 核心目的是确保显示设备能准确获取“当前帧/场景”的元数据,实现动态适配渲染。

HDR动态元数据(HDR Dynamic Metadata)是HDR(高动态范围)成像技术中的关键组成部分,用于动态描述视频内容中不同场景或帧的亮度特性,帮助显示设备更精准地渲染HDR画面,提升视觉体验。

核心作用

HDR内容的亮度范围远超传统SDR(标准动态范围),同一视频中不同场景的亮度可能差异极大(如从暗场夜景到明亮日光)。动态元数据的作用是:

  • 向显示设备传递场景或帧级别的亮度信息(如峰值亮度、亮度分布等)。
  • 指导显示设备根据当前内容的亮度特性动态调整渲染参数,避免过曝、欠曝或细节丢失。
  • 确保在不同性能的HDR显示设备上(如峰值亮度500尼特 vs 1000尼特),都能呈现最佳效果。

主要标准与格式

目前主流的HDR动态元数据标准有两种,互不兼容:

  1. HDR10+
    由三星、亚马逊等推动,基于SMPTE ST 2094-40标准。

    • 支持逐场景或逐帧更新元数据。
    • 元数据包含:场景亮度范围(最小/最大亮度)、色调映射参数、色彩体积信息等。
    • 开源免费,广泛用于流媒体(如Prime Video)、蓝光和部分电视设备。
  2. Dolby Vision
    由杜比实验室开发,基于SMPTE ST 2094-10标准。

    • 支持逐帧甚至逐区域的元数据(更精细的控制)。
    • 元数据包含:每个画面的亮度映射曲线、动态对比度调整参数等。
    • 采用闭环生态(需授权),画质表现受认可,常见于高端电视、流媒体(如Netflix)和电影发行。

此外,还有HLG(Hybrid Log-Gamma),但它是“静态元数据”方案,依赖显示设备自身调整,不支持动态场景适配。

区别

元数据包含的关键信息

无论哪种标准,动态元数据通常包含:

  • 峰值亮度(Peak Brightness):当前场景中最亮区域的亮度(单位:尼特,nit)。
  • 平均亮度(Average Brightness):场景整体的平均亮度水平。
  • 亮度分布(Luminance Distribution):画面中不同亮度区间的像素占比。
  • 色调映射指导(Tone Mapping Guidance):告诉显示设备如何将高动态范围压缩到自身支持的亮度范围内,同时保留细节。

与静态元数据的区别

  • 静态元数据(如基础HDR10):仅在视频开头提供一次全局亮度信息(如全片最高峰值亮度),无法适应场景变化,可能导致部分场景渲染不准确。
  • 动态元数据(HDR10+/Dolby Vision):实时更新,能针对每个场景甚至每一帧优化,更精准地还原内容创作者的意图。

应用场景

  • 流媒体平台(Netflix、Prime Video等)的HDR内容传输。
  • 蓝光光盘和UHD影碟的HDR视频存储。
  • 高端电视、投影仪等显示设备的HDR渲染。
  • 专业影视后期制作,用于标注内容的亮度特性。

总结

HDR动态元数据通过实时传递场景亮度信息,解决了HDR内容在不同设备上的适配问题,是提升HDR视觉体验的核心技术。选择HDR10+还是Dolby Vision,主要取决于内容生态和设备支持,但两者的目标都是让HDR画面更接近人眼所见的真实世界亮度和细节。

ffmpeg code chain

static int decode_nal_sei_prefix(GetBitContext *gb, void *logctx, HEVCSEI *s,
                                 const HEVCParamSets *ps, int type, int size)
{
    switch (type) {
    case 256:  // Mismatched value from HM 8.1
        return decode_nal_sei_decoded_picture_hash(&s->picture_hash, gb);
    case SEI_TYPE_FRAME_PACKING_ARRANGEMENT:
        return decode_nal_sei_frame_packing_arrangement(&s->frame_packing, gb);
    case SEI_TYPE_DISPLAY_ORIENTATION:
        return decode_nal_sei_display_orientation(&s->display_orientation, gb);
    case SEI_TYPE_PIC_TIMING:
        return decode_nal_sei_pic_timing(s, gb, ps, logctx, size);
    case SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME:
        return decode_nal_sei_mastering_display_info(&s->mastering_display, gb);
    case SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO:
        return decode_nal_sei_content_light_info(&s->content_light, gb);
    case SEI_TYPE_ACTIVE_PARAMETER_SETS:
        return decode_nal_sei_active_parameter_sets(s, gb, logctx);
    case SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35:
        return decode_nal_sei_user_data_registered_itu_t_t35(s, gb, logctx, size); // 这里
    case SEI_TYPE_USER_DATA_UNREGISTERED:
        return decode_nal_sei_user_data_unregistered(&s->unregistered, gb, size);
    case SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS:
        return decode_nal_sei_alternative_transfer(&s->alternative_transfer, gb);
    case SEI_TYPE_TIME_CODE:
        return decode_nal_sei_timecode(&s->timecode, gb);
    default:
        av_log(logctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
        skip_bits_long(gb, 8 * size);
        return 0;
    }
}
decode_nal_sei_prefix
	decode_nal_sei_user_data_registered_itu_t_t35
		decode_registered_user_data_dynamic_hdr_plus
			ff_parse_itu_t_t35_to_dynamic_hdr10_plus

其它的关键字段:

AV_FRAME_DATA_DYNAMIC_HDR_PLUS


网站公告

今日签到

点亮在社区的每一天
去签到