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

Node.js中FFmpeg未完成任务即执行回调的解决方法

问题解决:确保FFmpeg帧提取完成后再执行回调

你的代码核心问题是没有等待fnExtractFrameToJPG这个异步操作完成就执行了回调。video.fnExtractFrameToJPG返回的是Promise对象,必须等它的异步任务结束(状态变为resolved)后,再触发回调函数。原代码里用逗号分隔后直接调用callback(),属于同步执行,自然会提前跑起来。

下面给两种修正方案:

方案一:用Promise链式调用

把回调放在fnExtractFrameToJPG的.then()方法里,确保只在任务完成时执行:

function callback() {
  console.log("All done!")
}

async function main() {
  try {
    const process = new ffmpeg("star_wars_film_scene.mp4");
    process.then(function (video) {
      video.fnExtractFrameToJPG("frames/", {
        every_n_frames: 1500
      }).then(callback); // 等待帧提取完成后执行回调
    }, function (err) {
      console.log('Error: ' + err);
    });
  } catch (e) {
    console.log(e.code);
    console.log(e.msg);
  }
}

main()

方案二:用async/await简化代码(更推荐)

既然main已经是async函数,直接用await等待所有异步操作完成,代码逻辑更清晰:

function callback() {
  console.log("All done!")
}

async function main() {
  try {
    // 等待FFmpeg实例初始化完成
    const video = await new ffmpeg("star_wars_film_scene.mp4");
    // 等待帧提取任务执行完毕
    await video.fnExtractFrameToJPG("frames/", {
      every_n_frames: 1500
    });
    // 任务全部完成后再调用回调
    callback();
  } catch (e) {
    console.log(e.code || e.message);
    console.log(e.msg || '');
  }
}

main()

方案二的优势是把分散的错误处理合并到了try/catch里,避免了Promise链式调用的嵌套,可读性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 08:40:19