javascript - 流畅的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));
}
}
解决方案
创建一个function
withpromise
和 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))
})
})
}
现在只需使用函数ffmpegSync
and await
。
推荐阅读
- php - php中的sql没有数据显示
- javascript - Firestore 模拟器 - 虚拟机初始化期间发生错误
- c# - 由于保护级别 C#,Nbitcoin.Transaction 无法访问
- javascript - 如何在图表和刻度标签之间添加空格?
- rust - 当两个条件变量之一通知时,是否可以等待并返回?
- r - 堆积面积图 Y 轴不反映实际数据点
- spring - applicationContext.getBean() 与旧版应用程序
- java - javax.persistence 不存在但安装在 Maven 中
- php - 子视图刀片中的 Laravel 表单无法发布上传
- windows - 在 cli 中将分页文件设置为无