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
相关产品推荐
相关产品推荐

