You need to enable JavaScript to run this app.
文档中心
视频点播

视频点播

复制全文
下载 pdf
进阶功能
播放 HDR 视频
复制全文
下载 pdf
播放 HDR 视频

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

最近更新时间:2025.07.17 13:54:02
这个页面对您有帮助吗?
有用
有用
无用
无用