HarmonyOS 鸿蒙Next中OH_MD_KEY_I_FRAME_INTERVAL

HarmonyOS 鸿蒙Next中OH_MD_KEY_I_FRAME_INTERVAL 大家是否有遇到设置了 OH_AVFormat_SetIntValue(format, OH_MD_KEY_I_FRAME_INTERVAL, 40); 但是与预期不符的情况。我在华为MatePad11.5 s 灵动款,在使用软件编码成h264数据流时,貌似IDR帧的出现频率被锁死了120帧出现一次IDR帧。

4 回复

可以往如下方向进行排查:

1、buffer长时间没有释放;

2、buffer泄漏。

相关文档:【卡帧丢帧分析_指南】

更多关于HarmonyOS 鸿蒙Next中OH_MD_KEY_I_FRAME_INTERVAL的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


如下配置,我发现每隔30帧会收到一帧IDR帧

OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, sampleInfo.videoWidth);
OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, sampleInfo.videoHeight);
//    OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, 0);
OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, sampleInfo.pixelFormat);
OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE, sampleInfo.bitrateMode);
OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, sampleInfo.bitrate);
OH_AVFormat_SetIntValue(format, OH_MD_KEY_PROFILE, sampleInfo.hevcProfile);
//    OH_AVFormat_SetIntValue(format, OH_MD_KEY_I_FRAME_INTERVAL, 40); // 1ms 发送一个关键帧
//    OH_AVFormat_SetIntValue(format,OH_MD_KEY_VIDEO_ENABLE_LOW_LATENCY,1); //低时延特性
//    OH_AVFormat_SetIntValue(format,OH_MD_KEY_VIDEO_ENCODER_QP_MAX,28); //
//    OH_AVFormat_SetIntValue(format,OH_MD_KEY_VIDEO_ENCODER_QP_MIN,18); //

OH_MD_KEY_I_FRAME_INTERVAL是鸿蒙媒体数据单元键值,用于设置视频编码的I帧间隔参数。该键值作用于视频编码配置,通过OH_AVCodec_SetParameter函数传入OH_AVCodec实例。参数值为整数类型,单位通常为帧数,表示每N帧插入一个关键帧。该设置直接影响视频编码的GOP结构,较小的间隔值会提升视频随机访问能力但增加存储体积。在鸿蒙媒体子系统开发中,需配合其他编码参数共同配置视频编码器工作模式。

在HarmonyOS Next中,OH_MD_KEY_I_FRAME_INTERVAL 用于设置视频编码的I帧间隔(单位通常是帧数),但实际效果可能受设备硬件编码器限制或系统策略影响。你设置的40帧间隔被强制锁定为120帧,可能是以下原因:

  1. 硬件编码器限制:部分设备的H.264编码器对I帧间隔有最小阈值(如120帧),尤其在低功耗模式下。
  2. 系统级优化:为平衡性能与功耗,HarmonyOS可能动态调整编码参数,导致设置被覆盖。
  3. 编码模式兼容性问题:软件编码路径可能未完全适配参数,需检查是否使用OH_AVCODEC_CAP_SOFTWARE标志。

建议通过以下方式验证:

  • 使用OH_AVFormat_GetIntValue确认参数是否生效。
  • 检查编码器支持的参数范围(如通过OH_AVCodec_GetCapability)。
  • 尝试调整分辨率或码率,观察是否解除限制。

若问题持续,可能是当前设备或版本的已知约束,需关注后续SDK更新。

回到顶部