鸿蒙HarmonyOS实战开发:视频色彩空间转换
开发者可以调用本模块提供的C API接口,实现HDR2SDR、HDR2HDR、SDR2SDR的色彩空间转换。
鸿蒙NEXT开发实战往期必看文章:
一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发!
“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)
HarmonyOS NEXT应用开发案例实践总结合(持续更新......)
HarmonyOS NEXT应用开发性能优化实践总结(持续更新......)
开发者可以调用本模块提供的C API接口,实现HDR2SDR、HDR2HDR、SDR2SDR的色彩空间转换。
该能力常用于视频编辑和视频分享中:
- 视频编辑

- 视频分享

规格说明
支持的转换规格:
- 视频色彩空间转换算法为SDR2SDR:
OH_COLORSPACE_BT601_EBU_LIMIT
OH_COLORSPACE_BT601_SMPTE_C_LIMIT
OH_VIDEO_NONE
OH_VIDEO_NONE
NATIVEBUFFER_PIXEL_FMT_YCBCR_420_SP,
NATIVEBUFFER_PIXEL_FMT_YCRCB_420_SP,
NATIVEBUFFER_PIXEL_FMT_RGBA_8888
NATIVEBUFFER_PIXEL_FMT_YCBCR_420_SP,
NATIVEBUFFER_PIXEL_FMT_YCRCB_420_SP,
NATIVEBUFFER_PIXEL_FMT_RGBA_8888
OH_COLORSPACE_BT709_LIMIT
OH_COLORSPACE_BT709_LIMIT
OH_VIDEO_NONE
OH_VIDEO_NONE
NATIVEBUFFER_PIXEL_FMT_YCBCR_420_SP,
NATIVEBUFFER_PIXEL_FMT_YCRCB_420_SP,
NATIVEBUFFER_PIXEL_FMT_RGBA_8888
NATIVEBUFFER_PIXEL_FMT_YCBCR_420_SP,
NATIVEBUFFER_PIXEL_FMT_YCRCB_420_SP,
NATIVEBUFFER_PIXEL_FMT_RGBA_8888
- 视频色彩空间转换算法为HDR2SDR:
OH_COLORSPACE_BT2020_PQ_LIMIT
OH_COLORSPACE_BT2020_HLG_LIMIT
OH_VIDEO_HDR_VIVID
OH_VIDEO_HDR_VIVID
NATIVEBUFFER_PIXEL_FMT_YCBCR_P010,
NATIVEBUFFER_PIXEL_FMT_YCRCB_P010,
NATIVEBUFFER_PIXEL_FMT_RGBA_1010102
NATIVEBUFFER_PIXEL_FMT_YCBCR_P010,
NATIVEBUFFER_PIXEL_FMT_YCRCB_P010,
NATIVEBUFFER_PIXEL_FMT_RGBA_1010102
OH_COLORSPACE_BT709_LIMIT
OH_COLORSPACE_BT709_LIMIT
OH_VIDEO_NONE
OH_VIDEO_NONE
NATIVEBUFFER_PIXEL_FMT_YCBCR_420_SP,
NATIVEBUFFER_PIXEL_FMT_YCRCB_420_SP,
NATIVEBUFFER_PIXEL_FMT_RGBA_8888
NATIVEBUFFER_PIXEL_FMT_YCBCR_420_SP,
NATIVEBUFFER_PIXEL_FMT_YCRCB_420_SP,
NATIVEBUFFER_PIXEL_FMT_RGBA_8888
- 视频色彩空间转换算法为HDR2HDR:
OH_COLORSPACE_BT2020_PQ_LIMIT
OH_COLORSPACE_BT2020_PQ_LIMIT
OH_COLORSPACE_BT2020_PQ_LIMIT
OH_COLORSPACE_BT2020_HLG_LIMIT
OH_VIDEO_HDR_VIVID
OH_VIDEO_HDR_HDR10
OH_VIDEO_HDR_VIVID
OH_VIDEO_HDR_VIVID
NATIVEBUFFER_PIXEL_FMT_YCBCR_P010,
NATIVEBUFFER_PIXEL_FMT_YCRCB_P010,
NATIVEBUFFER_PIXEL_FMT_RGBA_1010102
NATIVEBUFFER_PIXEL_FMT_YCBCR_P010,
NATIVEBUFFER_PIXEL_FMT_YCRCB_P010,
NATIVEBUFFER_PIXEL_FMT_RGBA_1010102
NATIVEBUFFER_PIXEL_FMT_YCBCR_P010,
NATIVEBUFFER_PIXEL_FMT_YCRCB_P010,
NATIVEBUFFER_PIXEL_FMT_RGBA_1010102
NATIVEBUFFER_PIXEL_FMT_YCBCR_P010,
NATIVEBUFFER_PIXEL_FMT_YCRCB_P010,
NATIVEBUFFER_PIXEL_FMT_RGBA_1010102
OH_COLORSPACE_BT2020_HLG_LIMIT
OH_COLORSPACE_BT2020_HLG_LIMIT
OH_COLORSPACE_BT2020_HLG_LIMIT
OH_COLORSPACE_BT2020_PQ_LIMIT
OH_VIDEO_HDR_VIVID
OH_VIDEO_HDR_HLG
OH_VIDEO_HDR_HLG
OH_VIDEO_HDR_VIVID
NATIVEBUFFER_PIXEL_FMT_YCBCR_P010,
NATIVEBUFFER_PIXEL_FMT_YCRCB_P010,
NATIVEBUFFER_PIXEL_FMT_RGBA_1010102
NATIVEBUFFER_PIXEL_FMT_YCBCR_P010,
NATIVEBUFFER_PIXEL_FMT_YCRCB_P010,
NATIVEBUFFER_PIXEL_FMT_RGBA_1010102
NATIVEBUFFER_PIXEL_FMT_YCBCR_P010,
NATIVEBUFFER_PIXEL_FMT_YCRCB_P010,
NATIVEBUFFER_PIXEL_FMT_RGBA_1010102
NATIVEBUFFER_PIXEL_FMT_YCBCR_P010,
NATIVEBUFFER_PIXEL_FMT_YCRCB_P010,
NATIVEBUFFER_PIXEL_FMT_RGBA_1010102
支持的分辨率规格:
|
最小分辨率(单位:像素) |
最大分辨率(单位:像素) |
|---|---|
|
32*32 |
8192*8192 |
约束与限制
不允许在视频处理回调函数中,直接调用视频处理相关接口或其他耗时操作,请在应用自己的线程中调用。
开发指导
在 CMake 脚本中链接动态库
target_link_libraries(sample PUBLIC libvideo_processing.so)
开发步骤
- 添加头文件。
#include <video_processing.h> #include <video_processing_types.h> #include <external_window.h> #include <native_buffer.h> #include <iconsumer_surface.h> #include <ace/xcomponent/native_interface_xcomponent.h> - (可选)初始化环境。一般在进程内第一次使用时调用,可提前完成部分耗时操作。
OH_VideoProcessing_InitializeEnvironment(); - (可选)查询能力支持。建议在使用对应能力前调用。
//输入输出格式 VideoProcessing_ColorSpaceInfo inputFormat; VideoProcessing_ColorSpaceInfo outputFormat; inputFormat.metadataType = OH_VIDEO_HDR_HDR10; inputFormat.colorSpace = OH_COLORSPACE_BT2020_PQ_LIMIT; inputFormat.pixelFormat = NATIVEBUFFER_PIXEL_FMT_YCBCR_420_SP; outputFormat.metadataType = OH_VIDEO_HDR_HLG; outputFormat.colorSpace = OH_COLORSPACE_BT2020_HLG_LIMIT; outputFormat.pixelFormat = NATIVEBUFFER_PIXEL_FMT_YCBCR_420_SP; //能力查询 bool isSupport = H_VideoProcessing_IsColorSpaceConversionSupported(&inputFormat, &outputFormat); - 创建色彩空间转换模块。
应用可以通过视频处理引擎模块类型来创建色彩空间转换模块。示例中的变量说明如下:
- videoProcessor:色彩空间转换模块实例。
- VIDEO_PROCESSING_TYPE_COLOR_SPACE_CONVERSION:色彩空间转换类型。
- 预期返回值:VIDEO_PROCESSING_SUCCESS
// 通过指定视频处理引擎类型创建色彩空间转换模块实例 VideoProcessing_ErrorCode ret = OH_VideoProcessing_Create(&videoProcessor, VIDEO_PROCESSING_TYPE_COLOR_SPACE_CONVERSION); - 配置异步回调函数。
// 回调函数声明(其中userData会传递注册回调时传入的用户数据,如:this指针) void OnError(OH_VideoProcessing* videoProcessor, VideoProcessing_ErrorCode error, void* userData); void OnState(OH_VideoProcessing* videoProcessor, VideoProcessing_State state, void* userData); void OnNewOutputBuffer(OH_VideoProcessing* videoProcessor, uint32_t index, void* userData); // 创建回调实例 ret = OH_VideoProcessingCallback_Create(&callback); // 绑定回调函数 OH_VideoProcessingCallback_BindOnError(callback, OnError); OH_VideoProcessingCallback_BindOnState(callback, OnState); OH_VideoProcessingCallback_BindOnNewOutputBuffer(callback, OnNewOutputBuffer); // 注册回调函数 ret = OH_VideoProcessing_RegisterCallback(videoProcessor, callback, this); - 获取Surface。
//获取输入surface OHNativeWindow *inWindow = nullptr; ret = OH_VideoProcessing_GetSurface(videoProcessor, inWindow); - 设置Surface。
说明
也可以通过XComponent等其他方式获取OHNativeWindow实例,具体参见NativeWindows开发指导。
//surface回调 class VPESurfaceBufferConsumerListener : public OHOS::IBufferConsumerListener { public: explicit VPESurfaceBufferConsumerListener() {} void OnBufferAvailable() {} }; // 创建输出surface sptr<Surface> cs = nullptr; sptr<Surface> ps = nullptr; cs = Surface::CreateSurfaceAsConsumer(); listener = new VPESurfaceBufferConsumerListener(); cs->RegisterConsumerListener(listener); auto p = cs->GetProducer(); ps = Surface::CreateSurfaceAsProducer(p); outWindow = CreateNativeWindowFromSurface(&ps); // 配置输出surface if (!isMetadataGen) { (void)OH_NativeWindow_NativeWindowHandleOpt(outWindow, SET_FORMAT, param_.outFmt); ret = OH_NativeWindow_SetColorSpace(outWindow, param_.outColorSpace); } if (isHDRVividOut) { uint8_t val = OH_VIDEO_HDR_VIVID; ret = OH_NativeWindow_SetMetadataValue(outWindow, OH_HDR_METADATA_TYPE, sizeof(uint8_t), &val); } //设置输出surface ret = OH_VideoProcessing_SetSurface(videoProcessor, outWindow); - 调用OH_VideoProcessing_Start()启动色彩空间转换处理。
// 开始色彩空间转换处理 ret = OH_VideoProcessing_Start(videoProcessor); - 调用OH_VideoProcessing_Stop()停止色彩空间转换处理。
//停止色彩空间转换处理 ret = OH_VideoProcessing_Stop(videoProcessor); - 释放处理实例。
//停止色彩空间转换处理 OH_VideoProcessingCallback_Destroy(callback); OH_VideoProcessing_Destroy(videoProcessor); - 释放处理资源。
OH_VideoProcessing_DeinitializeEnvironment();

更多推荐
所有评论(0)