You need to enable JavaScript to run this app.
导航
播放 HDR 视频
最近更新时间:2025.07.17 13:54:02首次发布时间:2023.02.16 20:48:52
复制全文
我的收藏
有用
有用
无用
无用

HDR(High Dynamic Range,高动态范围)视频,相比普通 SDR(Standard Dynamic Range)视频拥有更高的色深、更广的动态范围和更强的色彩表现力,使得画面更真实、更有层次,很直观的提升视频画质,从而有效提升人们的观影感受。本文为您介绍使用播放器 SDK 时如何播放 HDR 视频。

前提条件

使用 HDR 视频播放功能前,请确保满足以下条件:

  • 设备支持:Android 系统版本 ≥ 9.0
  • 播放设置:
    • 使用 SurfaceView 作为视频渲染视图
    • 启用硬解(硬件解码)
  • 视频源要求:
    • 视频编码格式:H.265(HEVC)
    • HDR 标准:HDR10 或 HLG

判断设备是否支持 HDR 播放

播放前,先通过 isDeviceSupportHevcHDR 判断设备是否支持 HDR 播放,示例代码如下:

boolean support = TTVideoEngine.isDeviceSupportHevcHDR(context);

播放 HDR 视频

若设备支持 HDR 视频且已知源为 HDR,则可直接设置播放视频。

DirectUrl 模式

若您以 DirectUrl 模式播放 HDR 视频,参考设置播放源将 HDR 视频资源的 URL 设置给播放器即可。

Vid 模式

若您以 Vid 模式播放 HDR 视频,您需要参考以下步骤:

  1. 准备 HDR 视频源:通过视频点播媒体处理服务转出 HDR 视频,详细操作请见画质增强(旧版)
  2. 客户端请求 HDR 视频源:客户端从服务端获取 HDR 视频源时,服务端需在签发临时播放 Token 中指定 HDRDefinition 参数,从视频点播服务获取对应清晰度的 HDR 源。
  3. 客户端设置播放源:参考设置播放源设置 Vid 播放源。
  4. 管理与切换清晰度
    • onFetchedVideoInfo 回调中获取支持的清晰度列表:

      ttVideoEngine.setVideoInfoListener(new VideoInfoListener() {
          @Override
          public boolean onFetchedVideoInfo(VideoModel videoModel) {
              // 获取视频数据成功回调
              Log.v("VideoPlay", "onFetchedVideoInfo " + videoModel);
              if (videoModel == null) return false;
              
              // 获取当前 VideoModel 的清晰度数组,可用于清晰度列表展示
              Resolution[] resolutions = ttVideoEngine.supportedResolutionTypes();
                
              return false;
          }
      });
      
    • 调用 configResolution 切换 HDR 档位:

      说明

      详见 HDR 档位枚举

      ttVideoEngine.configResolution(High_HDR);
      
    • 通过 isHDRResolution 判断某清晰度是否为 HDR:

      /**
       判断是否是 HDR 档位清晰度
       
       @param resolution 清晰度
       */
      private boolean isHDRResolution(Resolution resolution) {
          return resolution.toString(TYPE_VIDEO).contains("HDR");
      }
      

判断播放源是否为 HDR

若不确定播放源是否为 HDR,可在 onPrepared 中对播放源是否为 HDR 进行判断。若为 HDR 则采用 HDR 播放模式,若不是则采用 SDR 播放模式。

// 在 prepare 成功时调用,判断播放源是否为 HDR
public void onPrepared(TTVideoEngine engine) {
    // 1 : 是;0 否。
    int isHDRSource = ttVideoEngine.getIntOption(PLAYER_OPTION_IS_HDR_SOURCE); 
}

播放 HDR 源时选择展示 HDR 或 SDR 效果

注意

注意,播放 HDR 源前,必须先判断设备是否支持 HDR,如不支持请播放非 HDR 源。

展示 HDR 效果

// 设置 HDR 播放源
ttVideoEngine.setStrategySource(source);

ttVideoEngine.setIntOption(PLAYER_OPTION_SKIP_FIND_STREAM_INFO, 0); //检测头信息
ttVideoEngine.setIntOption(PLAYER_OPTION_ENABLE_HDR_AUTOMATIC_IDENTIFICATION, 1); // HDR 自动检测
ttVideoEngine.setIntOption(PLAYER_OPTION_PREFER_BIT_DEPTH, 10);// 设置 10bit 位深
ttVideoEngine.setIntOption(PLAYER_OPTION_ENABLE_SET_HDRINFO_TO_TEXTURERENDER, 0 ); // 不设置 HDR 信息给 textureRender
ttVideoEngine.setIntOption(PLAYER_OPTION_ENABLE_HARDWARE_DECODE, 1); //使用硬解码
ttVideoEngine.setIntOption(PLAYER_OPTION_ENABLE_FALLBACK_SW_DEC, 0);// 禁止回退到软解

// 必须使用 surfaceView 进行渲染,才能展示 HDR 效果
ttVideoEngine.setSurfaceHolder(mVideoView.getHolder());
// 播放,此时是 HDR 展示效果
ttVideoEngine.play();

展示 SDR 效果

// 设置 HDR 播放源
ttVideoEngine.setStrategySource(source);

ttVideoEngine.setIntOption(PLAYER_OPTION_SKIP_FIND_STREAM_INFO, 0); //检测头信息
ttVideoEngine.setIntOption(PLAYER_OPTION_ENABLE_HDR_AUTOMATIC_IDENTIFICATION, 1);// HDR 自动检测
ttVideoEngine.setIntOption(PLAYER_OPTION_PREFER_BIT_DEPTH, 10);//设置 10bit 位深
ttVideoEngine.setIntOption(PLAYER_OPTION_ENABLE_SET_HDRINFO_TO_TEXTURERENDER, 0); //不设置 HDR 信息给 textureRender
ttVideoEngine.setIntOption(PLAYER_OPTION_ENABLE_HARDWARE_DECODE, 1); //使用硬解码
ttVideoEngine.setIntOption(PLAYER_OPTION_ENABLE_FALLBACK_SW_DEC, 0); // 禁止回退到软解
ttVideoEngine.setIntOption(PLAYER_OPTION_USE_TEXTURE_RENDER, 1); // 打开TEXTURERENDER

// 使用 surfaceView 进行渲染
ttVideoEngine.setSurfaceHolder(mVideoView.getHolder());
// 播放,此时是 SDR 展示效果
ttVideoEngine.play();

播放过程中切换 HDR 和 SDR 展示效果

// 设置 HDR 播放源
ttVideoEngine.setStrategySource(source);

ttVideoEngine.setIntOption(PLAYER_OPTION_SKIP_FIND_STREAM_INFO, 0); //检测头信息
ttVideoEngine.setIntOption(PLAYER_OPTION_ENABLE_HDR_AUTOMATIC_IDENTIFICATION, 1); // HDR 自动检测
ttVideoEngine.setIntOption(PLAYER_OPTION_PREFER_BIT_DEPTH, 10); // 设置10bit 位深
ttVideoEngine.setIntOption(PLAYER_OPTION_ENABLE_SET_HDRINFO_TO_TEXTURERENDER, 0); // 不设置 HDR 信息给 textureRender
ttVideoEngine.setIntOption(PLAYER_OPTION_ENABLE_HARDWARE_DECODE, 1); //使用硬解码
ttVideoEngine.setIntOption(PLAYER_OPTION_ENABLE_FALLBACK_SW_DEC, 0);// 禁止回退到软解
// 注意,如果设备不支持 HDR,需要打开软解回退,以保证能正常播放
// ttVideoEngine.setIntOption(PLAYER_OPTION_ENABLE_FALLBACK_SW_DEC, 1);

// 使用 surfaceView 进行渲染, 需要保证 SurfaceView 的宽高比跟视频的一致,否则可能出现画面拉伸问题
ttVideoEngine.setSurfaceHolder(mVideoView.getHolder());
// 播放
ttvideoEngine.play();

// 从 HDR 效果展示切换到 SDR 效果展示
ttVideoEngine.setIntOption(PLAYER_OPTION_USE_TEXTURE_RENDER, 1);
// 从 SDR 展示切换到 HDR 效果播放
//ttVideoEngine.setSurfaceHolder(null);
//ttVideoEngine.setIntOption(PLAYER_OPTION_USE_TEXTURE_RENDER, 0);
//ttVideoEngine.setSurfaceHolder(mSurfaceView.getHolder());

判断当前播放是否是 HDR 展示

// 在首帧渲染之后调用,判断当次播放是否为 HDR 展示
public void onFirstAVSyncFrame(TTVideoEngine engine) {
    // 1 : 是; 0 否。
    int isHDRPlay = ttVideoEngine.getIntOption(PLAYER_OPTION_IS_PLAY_HDR_MODE); 
}

参考信息

HDR 档位枚举

枚举值

分辨率

描述

Standard_HDR

360P

标清 HDR

High_HDR

480P

高清 HDR

SuperHigh_HDR

720P

超清 HDR

ExtremelyHigh_HDR

1080P

1080P HDR

TwoK_HDR

2K

2K HDR

FourK_HDR

4K

4K HDR