视频解码支持HDRVivid2SDR
在视频分享或者编辑场景时,开发者有时需要将HDR Vivid视频转换为SDR视频,可以调用AVCodec能力实现该功能。
限制约束
- 目前仅硬件解码器支持该能力。
- 目前仅Surface模式支持该能力。Surface模式和Buffer模式输出差异可参考视频解码。
- 目前使能该能力时,不支持码流分辨率变化,会通过回调函数OH_AVCodecOnError()报告错误码AV_ERR_UNSUPPORT。
- 在成功调用OH_VideoDecoder_Configure接口后,以及在启动OH_VideoDecoder_Start接口前,必须要先调用OH_VideoDecoder_Prepare接口。
- 调用OH_VideoDecoder_Reset接口之后,解码器将回到初始状态,需要重新调用OH_VideoDecoder_Configure、OH_VideoDecoder_Prepare和OH_VideoDecoder_SetSurface接口。
- 通过配置OH_MD_KEY_VIDEO_DECODER_OUTPUT_COLOR_SPACE,支持在解码后输出SDR图像,目前输入仅支持为HDR Vivid的码流,输出仅支持配置为OH_COLORSPACE_BT709_LIMIT。
在 CMake 脚本中链接动态库
target_link_libraries(sample PUBLIC libnative_media_avsource.so)
target_link_libraries(sample PUBLIC libnative_media_vdec.so)
target_link_libraries(sample PUBLIC libnative_media_core.so)
上述'sample'字样仅为示例,此处由开发者根据实际工程目录自定义。
开发步骤
-
添加头文件。
#include <multimedia/player_framework/native_avcodec_videodecoder.h>#include <multimedia/player_framework/native_avcapability.h>#include <multimedia/player_framework/native_avcodec_base.h>#include <multimedia/player_framework/native_avformat.h>#include <multimedia/player_framework/native_avbuffer.h>#include <fstream> -
参考HDR Vivid视频播放,添加头文件和解析文件,查询文件是否为HDR Vivid视频。
如果非HDR Vivid视频,则参考视频解码进行解码处理,此处不再赘述。
如果判断为HDR Vivid视频,则继续执行以下步骤。
如果输入源非HDR Vivid视频,会通过回调函数OH_AVCodecOnError()报告错误码AV_ERR_VIDEO_UNSUPPORTED_COLOR_SPACE_CONVERSION。
-
创建解码器实例。
查询系统支持的解码器能力,根据查询结果基于name创建硬解码器。
示例中的变量说明如下:
- videoDec:视频解码器实例的指针。
- capability:解码器能力查询实例的指针。
- OH_AVCODEC_MIMETYPE_VIDEO_HEVC:HEVC格式视频编解码器。
//3.1 获取指定硬件的视频HEVC解码器能力实例。OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_HEVC, false, HARDWARE);if (capability == nullptr){// 异常处理。}// 3.2 获取HEVC硬件解码器名称。const char *name = OH_AVCapability_GetName(capability);// 3.3 创建HEVC硬件解码实例。OH_AVCodec *videoDec = OH_VideoDecoder_CreateByName(name);由于目前仅硬件解码器支持该能力,因此必须根据解码器name进行创建。
-
调用OH_VideoDecoder_RegisterCallback()设置回调函数。
具体可参考:HDR Vivid视频播放-HDR Vivid视频解码 中的“步骤3:配置异步回调函数”
-
调用OH_VideoDecoder_Configure()配置解码器。
需配置项:视频帧宽度、视频帧高度、视频像素格式、指定输出为SDR。具体示例如下:
- DEFAULT_WIDTH:320像素宽度;
- DEFAULT_HEIGHT:240像素高度;
- DEFAULT_PIXELFORMAT: 像素格式,因为示例需要保存的YUV文件像素格式是NV12,所以设置为 AV_PIXEL_FORMAT_NV12。
// 视频帧宽度。int32_t width = 320;// 视频帧高度。int32_t height = 240;// 视频像素格式。constexpr OH_AVPixelFormat DEFAULT_PIXELFORMAT = AV_PIXEL_FORMAT_NV12;OH_AVFormat *format = OH_AVFormat_Create();// 5.1 配置视频宽、高、像素格式。OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, width);OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, height);OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, DEFAULT_PIXELFORMAT);// 5.2 指定输出为SDR视频。OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_DECODER_OUTPUT_COLOR_SPACE, OH_COLORSPACE_BT709_LIMIT);// 5.3 配置解码器。int32_t ret = OH_VideoDecoder_Configure(videoDec, format);if (ret != AV_ERR_OK) {// 异常处理。}OH_AVFormat_Destroy(format);通过配置OH_MD_KEY_VIDEO_DECODER_OUTPUT_COLOR_SPACE,支持在解码后输出SDR图像,目前输入仅支持为HDR Vivid的码流,输出仅支持配置为OH_COLORSPACE_BT709_LIMIT。
-
后续步骤具体可参考:视频解码Surface模式。