动态调整FFmpeg裁剪尺寸时,crop、scale及编码代码失效求助
问题分析与解决
核心原因
-11对应AVERROR(EAGAIN),本质是修改crop尺寸后,滤镜链的帧缓存不匹配,旧尺寸的缓存帧阻塞了新帧处理;且部分FFmpeg版本中crop滤镜动态修改尺寸后未正确刷新状态,导致后续帧处理中断。
修复步骤
修改命令发送标志
发送crop的宽高修改命令时,添加AVFILTER_CMD_FLAG_FAST标志,确保参数立即生效:check_av_result(avfilter_graph_send_command(&*filterGraph, "crop", "w", std::to_string(cropRectangle.Width()).c_str(), nullptr, 0, AVFILTER_CMD_FLAG_FAST)); check_av_result(avfilter_graph_send_command(&*filterGraph, "crop", "h", std::to_string(cropRectangle.Height()).c_str(), nullptr, 0, AVFILTER_CMD_FLAG_FAST));清空滤镜缓存
修改尺寸后,强制清空输入输出侧的缓存帧,避免旧尺寸帧干扰:// 修改crop参数后执行 av_buffersrc_flush(buffersrc_ctx); // 清空sink侧残留的旧帧 int flush_ret; do { flush_ret = av_buffersink_get_frame(buffersink_ctx, &*filteredFrame); if (flush_ret >= 0) { av_frame_unref(filteredFrame); } } while (flush_ret >= 0);校验参数合法性
确保cropRectangle.Width()和Height()为正整数,且不超过输入视频的宽高,避免crop滤镜进入错误状态。备选方案:重建滤镜图
若上述方法无效,可在修改尺寸时销毁旧滤镜图,重新初始化滤镜链,彻底解决参数兼容问题:// 销毁旧滤镜图 avfilter_graph_free(&filterGraph); // 复用初始的滤镜配置代码重新创建并配置滤镜链
内容的提问来源于stack exchange,提问作者Blindy
相关产品推荐
相关产品推荐

