You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL输出转存MP4时调用avcodec_send_frame返回无效参数错误排查

错误产生原因及修复方案

  • 核心问题:编码器未完成初始化
    你配置完AVCodecContext的所有参数后,没有调用avcodec_open2打开编码器,未初始化的编码器上下文传入avcodec_send_frame会直接触发输入非法错误。
    修复方式:在avcodec_parameters_from_context调用前,添加如下代码:
ret = avcodec_open2(codec_ctx, codec, NULL);
if (ret < 0) {
    fprintf(stderr, "Could not open codec: %s\n", av_err2str(ret));
    exit(1);
}
  • 帧内存重复分配导致帧参数异常
    构造函数中已经通过alloc_frame为AVFrame分配了符合编码器要求的缓冲区,但在addFrame方法中重复调用了av_image_alloc重新分配帧内存,不仅会造成内存泄漏,还可能破坏帧结构的格式校验规则,导致编码器校验帧参数失败。
    修复方式:删除addFrame中av_image_alloc相关的代码段即可,原有已分配的帧内存足够sws_scale写入转换后的YUV数据。

  • 成员变量未初始化导致pts异常
    类成员frame_order未设置初始值,第一次赋值给frame->pts的是随机垃圾值,部分严格的编码器会校验pts合法性触发错误。
    修复方式:在类构造函数中添加初始化代码frame_order = 0;。

  • 可选适配优化
    H.264编码器默认可能需要额外参数避免编码失败,可在打开编码器前添加如下配置:

// 关闭B帧避免pts顺序异常
codec_ctx->max_b_frames = 0;
// 配置编码预设,平衡编码速度和压缩率
av_dict_set(&avDict, "preset", "veryfast", 0);
av_dict_set(&avDict, "tune", "zerolatency", 0);

内容的提问来源于stack exchange,提问作者Frank Weslien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:06:00