HDR功能接入
更新时间:2022-11-18
接入准备
接入HDR功能,需要使用播放器SDK高级版,并申请高级版License。
功能介绍
在高级版SDK中,提供了HDR视频的解码和渲染能力,能够让HDR视频在高低端机型上都得到正确的色彩呈现。其中解码能力由播放内核原生支持,渲染能力由HDRKit组件提供,请确保该组件已集成到你的APP中。
SDK当前支持的HDR标准有:HDR10、HLG、HDR Vivid。
Demo体验
快速开始
- 初始化设备HDR能力信息和HDRKit组件
// 查询设备HDR能力信息
HdrInfo.initHDRDeviceInfo(mAppContext);
mHdrKit = new HdrKit();
// 需要传入您申请的高级版证书LicenseID,ID可以在百度智能云控制台(https://console.bce.baidu.com/bvc/#/bvc/player-license/list)查看
mHdrKit.init(mAppContext, "your-license-id");
- 设置输出surface和输入surface,典型场景是在onSurfaceCreated回调中进行设置
// 设置目标surface,HDR处理后的内容将渲染到此surface上
mHdrKit.prepareWithTargetSurface(mSurfaceholder.getSurface());
// 获取输入surface, 将原始画面渲染到此surface上
mMediaPlayer.setSurface(mHdrKit.getInputSurface());
- 渲染参数设置
// 设置输入画面宽高
mHdrKit.setInputSize(mSurfaceWidth, mSurfaceHeight);
// 设置渲染输出宽高
mHdrKit.setOutputSize(mSurfaceWidth, mSurfaceHeight);
// 设置输入视频的HDR标准,默认为HDR10
mHdrKit.setInputVideoContentType(HdrKit.ContentType.VIVID);
// 设置是否自动调节屏幕亮度,默认开启。
mHdrKit.setEnableBrightAdjust(true);
- HDR元数据设置
播放器提供了HDR10/HLG静态元数据和HDR Vivid动态元数据的回调
// 静态元数据回调
public boolean onHdrStaticMetadata(IMediaPlayer mp, int metadataType, byte[] metadata)
// 动态元数据回调
public boolean onVividMetadata(IMediaPlayer mp, byte[] metadata)
在这两个回调中,可以相应地将元数据设置给HDRKit组件
// 设置静态元数据
mHdrKit.setHdrStaticMetadata(metadataType, metadata);
// 设置动态元数据
mHdrKit.setVividMetadata(metadata);
- 开始渲染,典型场景是随播放器的start调用
// 开始渲染到目标surface
mHdrKit.startRenderFromSurface();
- 释放,典型场景是随播放器的release调用
// 销毁,如果要重新使用,则需要重新init
mHdrKit.release();
- 高级用法
HDRKit组件除了可以用surface作为输入输出之外,还可以用纹理id作为输入输出,使用纹理ID时需使用如下的接口
// 设置输入纹理id, 该id对应的是未处理的视频,HDR处理后的内容将渲染到指定的输出纹理id或屏幕上
mHdrKit.prepareWithInputTexId(texid);
// 设置输出纹理id,如果不调用,则直接渲染到屏幕
mHdrKit.setOutputTexId(outputTexId)
// 开始基于输入纹理id的渲染,调用一次,渲染一帧。典型场景是在GLSurfaceView的onDrawFrame中调用
mHdrKit.drawFrameFromTexId()
在播放器SDK Demo中的BDCloudVideoView类对上述流程有详细的展示,可以参考。
接口说明
HDRKit类
枚举成员 | 描述 |
---|---|
ContentType.HDR10 | HDR10标准视频 |
ContentType.HLG | HLG标准视频 |
ContentType.VIVID | HDR Vivid标准视频 |
ContentType.SDR | SDR视频 |
接口名 | 描述 |
---|---|
void init(Context context, String appID) | 初始化,鉴权失败时会抛出异常 |
void release() | 销毁。如果要重新使用,则需要重新调用init |
int getState() | 获取HDRKit当前状态 |
void setInputVideoContentType(ContentType contentType) | 输入视频的hdr类型,默认为HDR10 |
void setInputSize(int inputWidth, int inputHeight) | 输入画面宽高。 必须在prepareWithTargetSurface或prepareWithInputTexId之后调用,否则抛出异常。 |
void setOutputSize(int outputWidth, int outputHeight) | 渲染输出宽高。 必须在prepareWithTargetSurface或prepareWithInputTexId之后调用,否则抛出异常。 |
void setHdrStaticMetadata(int metadataType, byte[] metadata) | 传入HDR静态元数据。 metadataType 为SEI_MASTERING_DISPLAY_COLOUR_VOLUME(137)或SEI_CONTENT_LIGHT_LEVEL(144) |
void setVividMetadata(byte[] metadata) | 传入HDR Vivid动态元数据 |
void setEnableBrightAdjust(boolean enable) | 是否开启自动亮度调节 |
boolean getEnableBrightAdjust() | 查询是否开启了自动亮度调节 |
void prepareWithTargetSurface(Surface surface) | 设置目标surface,HDR处理后的内容将渲染到此surface上。必须在init之后调用,否则抛出异常。 |
Surface getInputSurface() | 获取输入surface, 将原始画面渲染到此surface上。 必须在prepareWithTargetSurface之后调用,否则抛出异常。 |
void startRenderFromSurface() | 开始渲染到目标surface。 必须在prepareWithTargetSurface之后调用,否则抛出异常。 |
void prepareWithInputTexId(int texid) | 设置输入纹理id, 该id对应的是未处理的视频,HDR处理后的内容将渲染到指定的输出纹理id或屏幕上。 必须在init之后调用,否则抛出异常。 |
void setOutputTexId(int outputTexId) | 设置输出纹理id,如果不调用,则直接渲染到屏幕。 必须在prepareWithInputTexId之后调用,否则抛出异常。 |
void drawFrameFromTexId() | 开始基于输入纹理id的渲染,调用一次,渲染一帧。 必须在prepareWithInputTexId之后调用,否则抛出异常。 |