视频解码支持HDRVivid2SDR
==================

在视频分享或者编辑场景时，开发者有时需要将HDR Vivid视频转换为SDR视频，可以调用AVCodec能力实现该功能。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ec/v3/ytgIPFoJQWW4CDEJFofEJw/zh-cn_image_0000002633849342.png?HW-CC-KV=V1&HW-CC-Date=20260709T132518Z&HW-CC-Expire=86400&HW-CC-Sign=D77FEFC61163879971C194DCCF097612666FCADE379EAFA87F7757622CB6AAF1)

#### 限制约束

1.  目前仅硬件解码器支持该能力。
    
2.  目前仅Surface模式支持该能力。Surface模式和Buffer模式输出差异可参考[视频解码](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/video-decoding)。
    
3.  目前使能该能力时，不支持码流分辨率变化，会通过回调函数OH\_AVCodecOnError()报告错误码[AV\_ERR\_UNSUPPORT](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-native-averrors-h#oh_averrcode)。
    
4.  在成功调用OH\_VideoDecoder\_Configure接口后，以及在启动OH\_VideoDecoder\_Start接口前，必须要先调用OH\_VideoDecoder\_Prepare接口。
    
5.  调用OH\_VideoDecoder\_Reset接口之后，解码器将回到初始状态，需要重新调用OH\_VideoDecoder\_Configure、OH\_VideoDecoder\_Prepare和OH\_VideoDecoder\_SetSurface接口。
    
6.  通过配置OH\_MD\_KEY\_VIDEO\_DECODER\_OUTPUT\_COLOR\_SPACE，支持在解码后输出SDR图像，目前输入仅支持为HDR Vivid的码流，输出仅支持配置为OH\_COLORSPACE\_BT709\_LIMIT。
    

#### \[h2\]在 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)

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/0/v3/UWr5OvfcQlqMSUEydmKnCA/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260709T132518Z&HW-CC-Expire=86400&HW-CC-Sign=83369020BC2FC71E31FC7D3E77825AAFCB7A91A2CD5071BA784B92E656F7CFB2)

上述'sample'字样仅为示例，此处由开发者根据实际工程目录自定义。

#### \[h2\]开发步骤

1.  添加头文件。
    
    #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>
    
2.  参考[HDR Vivid视频播放](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/hdr-vivid-video-player)，添加头文件和解析文件，查询文件是否为HDR Vivid视频。
    
    如果非HDR Vivid视频，则参考[视频解码](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/video-decoding)进行解码处理，此处不再赘述。
    
    如果判断为HDR Vivid视频，则继续执行以下步骤。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/3f/v3/0V00gDbEQoSALY21z2irGg/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260709T132518Z&HW-CC-Expire=86400&HW-CC-Sign=F8331CD1AD1689B918CDF5D7813F97B154C23E1B8D2B4C69E335D34705FA703E)
    
    如果输入源非HDR Vivid视频，会通过回调函数[OH\_AVCodecOnError()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-native-avcodec-base-h#oh_avcodeconerror)报告错误码[AV\_ERR\_VIDEO\_UNSUPPORTED\_COLOR\_SPACE\_CONVERSION](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-native-averrors-h#oh_averrcode)。
    
3.  创建解码器实例。
    
    查询系统支持的解码器能力，根据查询结果基于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);
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/0f/v3/z-791WU5R72ft0u7v-fM2Q/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260709T132518Z&HW-CC-Expire=86400&HW-CC-Sign=313593F79221839EC3934D364A9D9209574DE7AA55E3617D754E0EE08FBD6F56)
    
    由于目前仅硬件解码器支持该能力，因此必须根据解码器name进行创建。
    
4.  调用OH\_VideoDecoder\_RegisterCallback()设置回调函数。
    
    具体可参考：[HDR Vivid视频播放-HDR Vivid视频解码](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/hdr-vivid-video-player#hdr-vivid视频解码) 中的“步骤3：配置异步回调函数”
    
5.  调用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);
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/2d/v3/eMas2EJTT6OYNbk8NfR2Vg/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260709T132518Z&HW-CC-Expire=86400&HW-CC-Sign=A83F36DB26235F9D465E7DEBB8F39A9A4D64A2C1D4CD2B0EEBCA1CEC6E42B2DA)
    
    通过配置OH\_MD\_KEY\_VIDEO\_DECODER\_OUTPUT\_COLOR\_SPACE，支持在解码后输出SDR图像，目前输入仅支持为HDR Vivid的码流，输出仅支持配置为OH\_COLORSPACE\_BT709\_LIMIT。
    
6.  后续步骤具体可参考：[视频解码Surface模式](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/video-decoding#surface模式)。