HDR功能接入
更新时间:2023-06-07
接入准备
- 接入HDR功能,需要使用播放器SDK高级版,并申请高级版License。
- 在frameworks目录下有BDCloudHdrKit.framewok,在vendor目录下有libGRF.a,将它们导入到你的项目中,并设置到Xcode的Link Binary With Libraries选项中
功能介绍
在高级版SDK中,提供了HDR视频的解码和渲染能力,能够让HDR视频在高低端机型上都得到正确的色彩呈现。其中解码能力由播放内核原生支持,渲染能力由BDCloudHdrKit组件提供,请确保该组件已集成到你的App中。
SDK当前支持的HDR标准有:HDR10、HLG、HDR Vivid。
Demo体验
快速开始
目前提供两种使用方法
- 简单方法:直接使用BDCloudMediaPlayerController提供的新接口,一行代码开启HDR渲染支持
- 高级自定义方法:使用BDCloudHdrKit提供的底层接口,由接入方自行控制渲染逻辑
建议优先使用简单方法。
简单方法
// 给播放器实例传入播放URL
self.player.contentString = url;
// 使能HDR渲染
[self.player toggleEnableHdr:YES];
// 准备播放
[self.player prepareToPlay];
高级自定义方法
- 初始化和参数设置
BDCloudHdrKitRender *hdrKit
// 创建实例
_hdrKit = [[BDCloudHdrKitRender alloc] init];
// 用licenseId和绘制hdr内容的CAEAGLLayer进行hdrkit的初始化
[_hdrKit initContextwithLicense:_hdrLicenseId withLayer:(__bridge void *)(self.layer)];
// 设置输入视频的HDR标准,默认为HDR10
[_hdrKit setContentType:_hdrContentType];
// 设置输入视频画面宽高
[_hdrKit setInputVideoSize:inputw withHeight:inputh];
// 设置输入视频旋转角度
[_hdrKit setInputVideoRotate:_videoRotate];
// 设置缩放模式
[_hdrKit setScaleType:HDR_SCALE_AspectFit];
// 设置渲染输出画面宽高
int width = [[UIScreen mainScreen] bounds].size.width * _scaleFactor;
int height = [[UIScreen mainScreen] bounds].size.height * _scaleFactor;
[_hdrKit setOutputSize:width withHeight:height];
- 开始渲染
[_hdrKit startRender];
- 传入HDR元数据
// 传入HDR静态元数据
if (_hdrStaticMeta != NULL && _isStaticMetaUpdated) {
[_hdrKit setHdrStaticMetadata:_hdrStaticMetaType withData:(unsigned char*)[_hdrStaticMeta bytes] withLength:[_hdrStaticMeta length]];
_isStaticMetaUpdated = FALSE;
}
// 传入HDR Vivid动态元数据
if (_hdrVividMeta != NULL) {
[_hdrKit setVividMetadata:(unsigned char*)[_hdrVividMeta bytes] withLength:[_hdrVividMeta length]];
}
- 更新视频帧数据
// 输入未经处理的CVPixelBufferRef yuv数据(nv21格式),SDK将对此yuv数据进行处理后渲染到CAEAGLLayer上
[_hdrKit updateInputBuffer:pixel_buffer];
- 停止渲染和释放
[_hdrKit stopRender];
[_hdrKit clearContext];
接口说明
BDCloudMediaPlayerController
接口名 | 说明 |
---|---|
- (int)toggleEnableHdr:(BOOL)isEnable | 设置是否开启HDR渲染,成功开启返回0,失败返回-1 |
BDCloudHdrKitRender
接口名 | 说明 |
---|---|
- (instancetype)initContext:(NSString*)licenseID withLayer:(void*)layer | 初始化 licenseID:通过百度智能云控制台申请的licenseID layer:绘制hdr内容的CAEAGLLayer |
- (void)setInputVideoSize:(NSNumber*)width withHeight:(NSNumber*)height | 设置输入视频宽高 |
- (void)setInputVideoRotate:(NSNumber*)rotate | 设置输入视频旋转角度 |
- (void)setOutputSize:(NSNumber*)width withHeight:(NSNumber*)height | 设置渲染画布宽高 width:输出宽 height:输出高 |
- (void)setScaleType:(HdrScalingMode)type | 设置渲染缩放类型 |
- (void)setContentType:(HdrContentType)type | 设置HDR内容类型 |
- (void)updateInputBuffer:(CVPixelBufferRef)input | 输入未经处理的yuv数据,SDK将对此yuv数据进行处理后渲染到CAEAGLLayer上 input nv21格式的yuv数据 |
- (void)setHdrStaticMetadata:(int)type withData:(unsigned char*)data withLength:(size_t)data_length | 传入HDR静态元数据 type:SEI_MASTERING_DISPLAY_COLOUR_VOLUME(137)或SEI_CONTENT_LIGHT_LEVEL(144) data:指向元数据的指针 data_length:元数据长度 |
- (void)setVividMetadata:(unsigned char*)data withLength:(size_t)data_length | 传入HDR Vivid动态元数据 data:指向元数据的指针 data_length:元数据长度 |
- (void)startRender | 开始渲染 |
- (void)stopRender | 停止渲染 |
- (void)clearContext | 销毁实例 |