高动态范围HDR视频通过扩大亮度分量的动态范围(从100cd/m2到1000cd/m2),以及采用更宽的色彩空间BT2020,提供极致画质体验。从Android10开始,支持HDR视频播放。

包含BT709和BT2020的色彩空间示意图如下,由此可见,BT2020比BT709有更宽的色域。

一、HDR技术

HDR技术标准包括:Dolby-Vision、HDR10、HLG、PQ。支持HDR的编码器有HEVC和VP9。传输函数有ST-2084和HLG。元数据类型分为静态元数据和动态元数据。具体如下表所示:

 二、HDR解码

Android提供CodecCapabilities.profileLevels来判断是否支持HDR。对应的三种格式如下:

1、Dolby Vision

杜比视界对应MediaFormat的mimetype:

String MIMETYPE_VIDEO_DOLBY_VISION

对应的profileLevel:

int DolbyVisionProfileDvavPen
int DolbyVisionProfileDvavPer
int DolbyVisionProfileDvheDen
int DolbyVisionProfileDvheDer
int DolbyVisionProfileDvheDtb
int DolbyVisionProfileDvheDth
int DolbyVisionProfileDvheDtr
int DolbyVisionProfileDvheStn

2、HEVC的HDR10

HEVC解码器对应profileLevel:

int HEVCProfileMain10HDR10
int HEVCProfileMain10HDR10Plus

解码器需要支持解析SEI的metadata元数据,以及SPS中相关HDR信息(比如profile、level)。 

3、VP9的HLG与PQ

VP9解码器对应的profileLevel:

int VP9Profile2HDR
int VP9Profile2HDR10Plus
int VP9Profile3HDR
int VP9Profile3HDR10Plus

三、HDR渲染

Android提供Display.getHdrCapabilities来判断屏幕是否支持HDR渲染,相关常量如下:

  • int HDR_TYPE_HLG
  • int HDR_TYPE_HDR10
  • int HDR_TYPE_HDR10_PLUS
  • int HDR_TYPE_DOLBY_VISION
  • float INVALID_LUMINANCE

相关的方法如下:

  • float getDesiredMaxLuminance() // 最大亮度
  • float getDesiredMinLuminance() // 最小亮度
  • float getDesiredMaxAverageLuminance() // 最大平均亮度
  • int[] getSupportedHdrTypes() // 支持HDR类型

四、支持HDR的封装格式

HDR的封装格式有mp4、webm,如下表所示:

 HDR对应的技术、格式、解码器、元数据配置如下表所示:

五、HDR解码器通道

1、HDR10解码器通道

HDR信息在SEI或SPS中,解码器解析到HDR元数据后,传给surface渲染层,流程如下:

2、Dolby Vision解码器通道

dolby码流存储在mp4格式中。mimetype为"video/dolby-vision"的HDR轨道包含2-3层码流,包括:基础层、增强层、元数据层。解码流程如下:

3、VP9解码器通道

首先从webm/mkv容器提取metadata元数据,VP9解码器处理工作如下:

  • 接收普通码流进行解码;
  • 接收HDR静态元数据;
  • 传输静态/动态元数据给display显示层;

webm/mkv的metadata位于Tracks/TrackEntry/Video/Color,结构如下图:

 参考资料:

Android HDR视频​​​​​​​

webm格式官方介绍

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐