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

动态调整FFmpeg裁剪尺寸时,crop、scale及编码代码失效求助

问题分析与解决

核心原因

-11对应AVERROR(EAGAIN),本质是修改crop尺寸后,滤镜链的帧缓存不匹配,旧尺寸的缓存帧阻塞了新帧处理;且部分FFmpeg版本中crop滤镜动态修改尺寸后未正确刷新状态,导致后续帧处理中断。

修复步骤

  1. 修改命令发送标志
    发送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));
    
  2. 清空滤镜缓存
    修改尺寸后,强制清空输入输出侧的缓存帧,避免旧尺寸帧干扰:

    // 修改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);
    
  3. 校验参数合法性
    确保cropRectangle.Width()和Height()为正整数,且不超过输入视频的宽高,避免crop滤镜进入错误状态。

  4. 备选方案:重建滤镜图
    若上述方法无效,可在修改尺寸时销毁旧滤镜图,重新初始化滤镜链,彻底解决参数兼容问题:

    // 销毁旧滤镜图
    avfilter_graph_free(&filterGraph);
    // 复用初始的滤镜配置代码重新创建并配置滤镜链
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:30:28