HDR(High Dynamic Range,高动态范围)视频,相比普通 SDR(Standard Dynamic Range)视频拥有更高的色深、更广的动态范围和更强的色彩表现力,使得画面更真实、更有层次,很直观的提升视频画质,从而有效提升人们的观影感受。本文为您介绍使用播放器 SDK 时如何播放 HDR 视频。
使用 HDR 视频播放功能前,请确保满足以下条件:
SurfaceView 作为视频渲染视图播放前,先通过 isDeviceSupportHevcHDR 判断设备是否支持 HDR 播放,示例代码如下:
boolean support = TTVideoEngine.isDeviceSupportHevcHDR(context);
若设备支持 HDR 视频且已知源为 HDR,则可直接设置播放视频。
若您以 DirectUrl 模式播放 HDR 视频,参考设置播放源将 HDR 视频资源的 URL 设置给播放器即可。
若您以 Vid 模式播放 HDR 视频,您需要参考以下步骤:
HDRDefinition 参数,从视频点播服务获取对应清晰度的 HDR 源。在 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,可在 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,如不支持请播放非 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();
// 设置 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 播放源 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 展示 public void onFirstAVSyncFrame(TTVideoEngine engine) { // 1 : 是; 0 否。 int isHDRPlay = ttVideoEngine.getIntOption(PLAYER_OPTION_IS_PLAY_HDR_MODE); }
枚举值 | 分辨率 | 描述 |
|---|---|---|
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 |