首页 > 解决方案 > 流畅的ffmpeg没有同步运行

问题描述

我正在编写一个程序,我需要使用 ffmpeg 多次处理视频。ffmpeg 代码(如下)位于承诺的“then”语句中。

ffmpeg(path)
  .size('640x?')
  .aspect('1:1')
  .autopad('#682BAB')
  .saveToFile(`${userDirPath}/11-${userFileName}`)
  .on('end', () => {
    ffmpeg()
      .input('test-11-start.mp4')
      .mergeAdd(`${userDirPath}/11-${userFileName}`)
      .mergeAdd('test-11-end.mp4')
      .mergeToFile(`${userDirPath}/11-final-${userFileName}`, 'temp/')
      .on('end', () => console.log('FFmpeg done!'));
  });

在此之后还有另一个 ffmpeg 函数(相同,但具有不同的纵横比),然后是带有其他一些函数的“then”语句。

问题是这个 ffmpeg 函数异步运行,并且下一个语句(使用 ffmpeg func 的结果文件)在它完成执行之前执行,所以我希望它同步运行。我已经尝试过异步等待(如下),但它仍然异步运行。代码有什么问题?

async function ffmpegMerge() {
  try {
    await ffmpeg(path)
    .size('640x?')
    .aspect('1:1')
    .autopad('#682BAB')
    .saveToFile(`${userDirPath}/11-${userFileName}`)
    .on('end', () => {
      ffmpeg()
        .input(`test-11-start.mp4`)
        .mergeAdd(`${userDirPath}/11-${userFileName}`)
        .mergeAdd(`test-11-end.mp4`)
        .mergeToFile(`${userDirPath}/11-final-${userFileName}.mp4`, 'temp/')
        .on('end', () => console.log('FFmpeg done!'));
    })
  }
  catch (err) {
    return Promise.reject(new Error(err));
  }
}

标签: javascriptnode.jsffmpegasync-awaitfluent-ffmpeg

解决方案


创建一个functionwithpromise和 useawait以等待function解决。

这是一个ffmpeg同步使用的例子:

function ffmpegSync(){
   return new Promise((resolve,reject)=>{
      ffmpeg(path)
         .size('640x?')
         .aspect('1:1')
         .autopad('#682BAB')
         .saveToFile(`${userDirPath}/11-${userFileName}`)
         .on('end', () => {
            ffmpeg()
               .input(`test-11-start.mp4`)
               .mergeAdd(`${userDirPath}/11-${userFileName}`)
               .mergeAdd(`test-11-end.mp4`)
               .mergeToFile(`${userDirPath}/11-final-${userFileName}.mp4`, 'temp/')
               .on('end', () => console.log('FFmpeg done!'));
               resolve()
         })
         on('error',(err)=>{
            return reject(new Error(err))
         })
   })
}

现在只需使用函数ffmpegSyncand await


推荐阅读