B帧视频编码
======

从API version 20开始，支持B帧视频编码。

**双向预测帧**，又叫B帧（B frame），是视频编码标准中定义的主要帧类型之一。B帧与P帧的主要差别在于P帧仅支持前向预测，而B帧支持双向预测。

B帧编码预测过程同时利用前后帧的信息，可以显著降低信号的时域冗余，具有更高的压缩效率。

使能B帧的影响：

*   使能B帧，会导致P帧编码时域参考帧的距离增加，可能影响P帧的压缩率和画质；一般在时域较复杂的场景要联合考虑P帧和B帧的综合影响；
*   使能B帧，也会增加编码和解码的端到端时延。

#### 适用场景

*   录像场景
*   编辑导出场景
*   视频转码场景
*   非低时延直播场景

#### 约束和限制

*   **支持的平台**：该能力与平台能力有关，可以通过[OH\_AVCapability\_IsFeatureSupported](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-native-avcapability-h#oh_avcapability_isfeaturesupported)接口查询系统支持情况。
*   **支持的API版本**：API version 20及以后。
*   **支持的编码器**：该能力与编码器能力有关，可以通过[OH\_AVCodec\_GetCapabilityByCategory](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-native-avcapability-h#oh_avcodec_getcapabilitybycategory)接口查询支持情况。
*   **支持的码控模式**：VBR、CBR、SQR、CQ，从API版本26.0.0开始，新增支持CBR\_HIGH\_QUALITY。
*   不支持与时域可分层视频编码共同使能。
*   不支持与长期参考帧共同使能。

#### 接口介绍

支持B帧编码特性需要在初始阶段配置，全程生效，不支持动态修改。

开发配置参数如下：

| 配置参数 | 语义 | 格式 |
| :-- | :-- | :-- |
| OH\_MD\_KEY\_VIDEO\_ENCODER\_ENABLE\_B\_FRAME | 
视频编码使能B帧参数。

在配置阶段配置，仅特性支持才会真正使能成功。

 | int |
| OH\_MD\_KEY\_VIDEO\_ENCODER\_MAX\_B\_FRAMES | 

视频编码支持最大B帧数量。

该接口仅供查询。

 | int |

#### 开发指导

基础编码功能请参考[视频编码](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/video-encoding)开发指南，下面仅针对B帧编码做具体说明。

1.  在初始阶段创建编码实例时，校验当前视频编码器是否支持B帧编码特性。
    
    // 1.1 获取对应视频编码器能力实例，此处以H.265为例。
    OH\_AVCapability \*cap = OH\_AVCodec\_GetCapabilityByCategory(OH\_AVCODEC\_MIMETYPE\_VIDEO\_HEVC, true, HARDWARE);
    if (cap != nullptr) {
        OH\_LOG\_INFO("Get codec Capability success!");
        // 1.2 通过特性能力查询接口校验是否支持B帧编码特性。
        bool isSupported = OH\_AVCapability\_IsFeatureSupported(cap, VIDEO\_ENCODER\_B\_FRAME);
        int32\_t supportedMaxBFrameCount = 0;
        if (isSupported) {
            OH\_LOG\_INFO("Feature VIDEO\_ENCODER\_B\_FRAME is Supported!");
            // 1.3 确定支持的最大B帧数量。
            OH\_AVFormat \*property = OH\_AVCapability\_GetFeatureProperties(cap, VIDEO\_ENCODER\_B\_FRAME);
            OH\_AVFormat\_GetIntValue(property, OH\_MD\_KEY\_VIDEO\_ENCODER\_MAX\_B\_FRAMES, &supportedMaxBFrameCount);
            OH\_LOG\_INFO("Get supportedMaxBFrameCount,value is %{public}d!", supportedMaxBFrameCount);
            // 1.4 销毁临时AVFormat。
            OH\_AVFormat\_Destroy(property);
        } else {
            OH\_LOG\_ERROR("Feature VIDEO\_ENCODER\_B\_FRAME is not Supported!");
        }
    } else {
        OH\_LOG\_ERROR("codec Capability is null!");
    }
    
    若支持，则可以使能B帧编码特性。
    
2.  在配置阶段，配置使能B帧编码特性的参数。
    
    // 2.1 创建配置用临时AVFormat。
    OH\_AVFormat \*format = OH\_AVFormat\_Create();
    // 2.2 填充使能参数键值对。
    OH\_AVFormat\_SetIntValue(format, OH\_MD\_KEY\_VIDEO\_ENCODER\_ENABLE\_B\_FRAME, 1);
    // 2.3 参数配置。
    int32\_t ret = OH\_VideoEncoder\_Configure(videoEnc, format);
    if (ret != AV\_ERR\_OK) {
        // 异常处理。
    }
    // 2.4 配置完成后销毁临时AVFormat。
    OH\_AVFormat\_Destroy(format);
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/47/v3/EsDIDDEUQG-Uu0hF0Kpq0A/caution_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260709T132516Z&HW-CC-Expire=86400&HW-CC-Sign=F2B09A60A3EDB11A54B00D20E343A32F19A27CA68A272F40B0EFEFCBCFAD086D)
    
    *   使能B帧编码功能在configure环节是弱校验，如果参数配置有误或者编码器不支持特性仍会返回AV\_ERR\_OK，但会打印Warning信息。请结合码流产物和运行日志判断是否真实使能。
    *   在使能B帧编码时，实际编码码流中的B帧结构和B帧数量依赖平台能力。