【发布时间】:2020-04-07 10:51:35
【问题描述】:
我正在编写一个程序,我需要使用 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));
}
}
【问题讨论】:
-
为什么不将第一个
ffmpeg"code" 放入一个函数中,该函数返回一个 Promise 并在渲染完成时解析(您记录 FFMPEG 完成!)。然后第二个ffmpegMerge()函数在第一个解析时被调用? -
我确实尝试过,但奇怪的是没有奏效。我在promise 中使用promise 来解决这个问题,将其余代码放在第二个
ffmpeg()的.on('end', () => {})中。我曾经认为嵌套的 Promise 是一种不好的做法,这就是为什么我之前没有这样做,但事实并非如此。
标签: javascript node.js ffmpeg async-await fluent-ffmpeg