鸿蒙NEXT开发实战往期必看文章:

一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发!

“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)

HarmonyOS NEXT应用开发案例实践总结合(持续更新......)

HarmonyOS NEXT应用开发性能优化实践总结(持续更新......)


开发者可以调用本模块提供的C API接口,实现HDR2SDR、HDR2HDR、SDR2SDR的色彩空间转换。

该能力常用于视频编辑和视频分享中:

  • 视频编辑

  • 视频分享

规格说明

支持的转换规格:

  • 视频色彩空间转换算法为SDR2SDR:

    输入ColorSpace

    OH_COLORSPACE_BT601_EBU_LIMIT

    OH_COLORSPACE_BT601_SMPTE_C_LIMIT

    输入MetadataType

    OH_VIDEO_NONE

    OH_VIDEO_NONE

    输入pixelFormat

    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

    输出ColorSpace

    OH_COLORSPACE_BT709_LIMIT

    OH_COLORSPACE_BT709_LIMIT

    输出MetadataType

    OH_VIDEO_NONE

    OH_VIDEO_NONE

    输出pixelFormat

    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:

    输入ColorSpace

    OH_COLORSPACE_BT2020_PQ_LIMIT

    OH_COLORSPACE_BT2020_HLG_LIMIT

    输入MetadataType

    OH_VIDEO_HDR_VIVID

    OH_VIDEO_HDR_VIVID

    输入pixelFormat

    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

    输出ColorSpace

    OH_COLORSPACE_BT709_LIMIT

    OH_COLORSPACE_BT709_LIMIT

    输出MetadataType

    OH_VIDEO_NONE

    OH_VIDEO_NONE

    输出pixelFormat

    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:

    输入ColorSpace

    OH_COLORSPACE_BT2020_PQ_LIMIT

    OH_COLORSPACE_BT2020_PQ_LIMIT

    OH_COLORSPACE_BT2020_PQ_LIMIT

    OH_COLORSPACE_BT2020_HLG_LIMIT

    输入MetadataType

    OH_VIDEO_HDR_VIVID

    OH_VIDEO_HDR_HDR10

    OH_VIDEO_HDR_VIVID

    OH_VIDEO_HDR_VIVID

    输入pixelFormat

    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

    输出ColorSpace

    OH_COLORSPACE_BT2020_HLG_LIMIT

    OH_COLORSPACE_BT2020_HLG_LIMIT

    OH_COLORSPACE_BT2020_HLG_LIMIT

    OH_COLORSPACE_BT2020_PQ_LIMIT

    输出MetadataType

    OH_VIDEO_HDR_VIVID

    OH_VIDEO_HDR_HLG

    OH_VIDEO_HDR_HLG

    OH_VIDEO_HDR_VIVID

    输出pixelFormat

    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)

开发步骤

  1. 添加头文件。
    #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>
  2. (可选)初始化环境。一般在进程内第一次使用时调用,可提前完成部分耗时操作。
    OH_VideoProcessing_InitializeEnvironment();
  3. (可选)查询能力支持。建议在使用对应能力前调用。
    //输入输出格式
    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);
  4. 创建色彩空间转换模块。

    应用可以通过视频处理引擎模块类型来创建色彩空间转换模块。示例中的变量说明如下:

    • videoProcessor:色彩空间转换模块实例。
    • VIDEO_PROCESSING_TYPE_COLOR_SPACE_CONVERSION:色彩空间转换类型。
    • 预期返回值:VIDEO_PROCESSING_SUCCESS
    // 通过指定视频处理引擎类型创建色彩空间转换模块实例
    VideoProcessing_ErrorCode ret = OH_VideoProcessing_Create(&videoProcessor, VIDEO_PROCESSING_TYPE_COLOR_SPACE_CONVERSION);
  5. 配置异步回调函数。
    // 回调函数声明(其中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);
  6. 获取Surface。
    //获取输入surface
    OHNativeWindow *inWindow = nullptr;
    ret = OH_VideoProcessing_GetSurface(videoProcessor, inWindow);
  7. 设置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);
  8. 调用OH_VideoProcessing_Start()启动色彩空间转换处理。
    // 开始色彩空间转换处理
    ret = OH_VideoProcessing_Start(videoProcessor);
  9. 调用OH_VideoProcessing_Stop()停止色彩空间转换处理。
    //停止色彩空间转换处理
    ret = OH_VideoProcessing_Stop(videoProcessor);
  10. 释放处理实例。
    //停止色彩空间转换处理
    OH_VideoProcessingCallback_Destroy(callback);
    OH_VideoProcessing_Destroy(videoProcessor);
  11. 释放处理资源。
    OH_VideoProcessing_DeinitializeEnvironment();

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐