我正在尝试同步流畅的 ffmpeg 和
await
它的完成。我把它包裹在promise
中并等待它解决。
问题是在处理第二个块后它停止执行任何操作。我得到的输出是:
Processing: NaN% done
Processing: 12.710198594559962% done
Processing: 25.846254358525282% done
然后它就挂起并且什么都不做。我正在使用 NodeJS 的
PassThrough
将数据从 ffpmeg 传输到。如果我删除 promise
并正常使用,那么它就可以正常工作。但我需要承诺,因为此后还有其他代码必须等待 ffmpeg 首先完成。
更新:如果我不使用
PassThrough()
变量而是输出到文件,例如.output('test.mp4', {end: true})
那么即使在承诺中它也能正常工作。
import {PassThrough} from 'node:stream';
import FFMpeg from 'fluent-ffmpeg';
let PassThroughStream = new PassThrough();
function ffmpegPromise() {
return new Promise((resolve, reject) => {
FFMpeg('/testvid.mp4')
.videoCodec('libx264')
.audioCodec('libmp3lame')
.size('640x480')
// Stream output requires manually specifying output formats
.format('mp4')
.outputOptions('-movflags dash')
.on('progress', function (progress) {
console.log('Processing: ' + progress.percent + '% done');
})
.on('error', function (err) {
console.log('An error occurred: ' + err.message);
reject(err);
})
.on('end', function () {
console.log('FFMpeg Processing finished!');
resolve()
})
.output(PassThroughStream, {end: false}).run();
})
}
await ffmpegPromise();
下面的代码工作正常,即使它是在一个承诺中。它只是不使用 PassThrough 变量:
//import {PassThrough} from 'node:stream';
import FFMpeg from 'fluent-ffmpeg';
//let PassThroughStream = new PassThrough();
function ffmpegPromise() {
return new Promise((resolve, reject) => {
FFMpeg('/testvid.mp4')
.videoCodec('libx264')
.audioCodec('libmp3lame')
.size('640x480')
// Stream output requires manually specifying output formats
.format('mp4')
.outputOptions('-movflags dash')
.on('progress', function (progress) {
console.log('Processing: ' + progress.percent + '% done');
})
.on('error', function (err) {
console.log('An error occurred: ' + err.message);
reject(err);
})
.on('end', function () {
console.log('FFMpeg Processing finished!');
resolve()
})
.output('test.mp4', {end: false}).run();
})
}
await ffmpegPromise();
通过这个方法你可以得到你需要的Promise。
为了同步进行处理,您需要删除await关键字。
这仍然允许您使用 Promise 并强制您的代码等待,而不是将其作为委托发送。
在这里阅读更多内容:MDN等待