Fluent ffmpeg 不同步运行

sci*_*lic 5 javascript ffmpeg node.js async-await fluent-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!'));
  });
Run Code Online (Sandbox Code Playgroud)

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

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

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));
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 12

创建一个functionwithpromise并使用await它来等待问题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))
         })
   })
}
Run Code Online (Sandbox Code Playgroud)

现在只需使用函数ffmpegSyncawait