- 使能B帧编码功能在configure环节是弱校验,如果参数配置有误或者编码器不支持特性仍会返回AV_ERR_OK,但会打印Warning信息。请结合码流产物和运行日志判断是否真实使能。
- 在使能B帧编码时,实际编码码流中的B帧结构和B帧数量依赖平台能力。
从API version 20开始,支持B帧视频编码。
双向预测帧,又叫B帧(B frame),是视频编码标准中定义的主要帧类型之一。B帧与P帧的主要差别在于P帧仅支持前向预测,而B帧支持双向预测。
B帧编码预测过程同时利用前后帧的信息,可以显著降低信号的时域冗余,具有更高的压缩效率。
使能B帧的影响:
支持B帧编码特性需要在初始阶段配置,全程生效,不支持动态修改。
开发配置参数如下:
| 配置参数 | 语义 | 格式 |
|---|---|---|
| OH_MD_KEY_VIDEO_ENCODER_ENABLE_B_FRAME | 视频编码使能B帧参数。 在配置阶段配置,仅特性支持才会真正使能成功。 | int |
| OH_MD_KEY_VIDEO_ENCODER_MAX_B_FRAMES | 视频编码支持最大B帧数量。 该接口仅供查询。 | int |
基础编码功能请参考视频编码开发指南,下面仅针对B帧编码做具体说明。
在初始阶段创建编码实例时,校验当前视频编码器是否支持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帧编码特性。
在配置阶段,配置使能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);