【问题标题】:ffmpeg doesnt wait for function to finish before running callbackffmpeg 在运行回调之前不等待函数完成
【发布时间】:2022-12-18 17:05:20
【问题描述】:

我正在使用 ffmpeg 从视频中提取一些帧。不幸的是,节点 js 在运行回调函数之前不会等待 ffmpeg 完成任务如何确保在运行回调之前任务已经完成?

我已经为此苦苦挣扎了几个小时,非常感谢您的帮助


function callback() {

console.log("All done!")
}
async function main()
{
    try {
        var process = new ffmpeg("star_wars_film_scene.mp4");
        process.then(function (video) {
            video.fnExtractFrameToJPG("frames/", {
                every_n_frames : 1500
            }), callback()
        }, function (err) {
            console.log('Error: ' + err);
        });
     } catch (e) {
        console.log(e.code);
        console.log(e.msg);
     }

    }
     


  main()

【问题讨论】:

  • 只传递 callback 而不是 callback()。您正在调用它,然后传递返回值。相反,您需要传递函数引用本身而不调用它。
  • @jfriend00 简单地删除括号只会导致没有任何内容被打印出来,所以我一定是做错了什么。我对编码很陌生,有点不确定我将如何实施这样的解决方案,你能不能给我一个例子,说明我如何做到这一点。谢谢您的帮助。

标签: node.js ffmpeg asynccallback


【解决方案1】:

我不能确切地说出您的安装出了什么问题。我可以说这个示例代码直接取自 ffmpeg 模块页面(稍微调整以添加更多错误处理)对我来说工作得很好。因此,如果您调整代码使其像这样工作并确保正确安装了 ffmpeg 模块和 ffmpeg 可执行文件,它应该可以工作:

const ffmpeg = require('ffmpeg');

try {
    const process = new ffmpeg('full path to your video here');
    process.then(function(video) {
        // Callback mode
        video.fnExtractFrameToJPG('D:/temp', {
            frame_rate: 1,
            number: 5,
            file_name: 'my_frame_%t_%s'
        }, function(error, files) {
            if (error) {
                console.log(error);
                return;
            }
            console.log('Frames: ' + files);
        });
    }, function(err) {
        console.log(err);
    });
} catch (e) {
    console.log(e.code);
    console.log(e.msg);
}

当我第一次在我的系统上运行这段代码时,我得到了一个错误,因为 ffmpeg 可执行文件(安装在我的系统上)不在我的系统路径中,所以当 ffmpeg 模块试图运行 ffmpeg 可执行文件时,它没有找到它并为此输出一条错误消息。一旦我修复它以将其包含在我的路径中,它就会按预期工作并从我传递给它的视频中捕获 5 帧。

【讨论】:

    【解决方案2】:
    try {
        const process = new ffmpeg('star_wars_film_scene.mp4');
        process.then(function(video) {
            // Callback mode
            video.fnExtractFrameToJPG('helpers/frames/', {
                every_n_frames: 500
                
            }, function(error, files) {
                if (error) {
                    console.log(error);
                    return;
                }
                console.log(‘all done’) 
            });
        }, function(err) {
            console.log(err);
        });
    } catch (e) {
        console.log('Houston, we have a problem')
        console.log(e.code);
        console.log(e.msg);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多