Electron和NodeJS:使用实时流异步执行shell命令



电子:实时获取文件转换百分比:

我想运行命令ffmpeg -i video.mp4(示例(将视频转换为另一种格式。但我想获得流程输出中流式传输的转换百分比,并在我的Electron应用程序或NodeJS中获得它。

我已经尝试了所有方法:spawnforkexec,所有这些方法都会返回流程输出的最后一行。我想要写的每一行的实时流,以显示进度的百分比。

我试过:

货叉

const {fork} = require('child_process')
const forked = fork('ffmpeg -i video.mp4');
forked.on('message', (msg) => {
console.log(msg);
})

Exec备选方案1

const execFile = require('child_process').execFile;
execFile('ffmpeg -i video.mp4', [], (e, stdout, stderr) => {
if (e instanceof Error){
console.error(e);

}
console.log('stdout ', stdout)
console.log('stderr ', stderr);
})

Exec Alternative 2

const exec = require('child_process').exec;
exec('ffmpeg -i video.mp4', (error, stdout, stderr) => { 
console.log(stdout); 
});
/*EXEC Alternative 2*/
const exec = require('child_process').exec;
const proccessing = exec('ffmpeg -i video.mp4');
proccessing.stdout.on('data', function(data) {
console.log(data); 
});
proccessing.stdout.pipe(process.stdout);

繁殖

const spawn = require('child_process').spawn,
const processing = spawn('ffmpeg -i video.mp4');
processing .stdout.on('data', function (data) {
console.log('stdout: ' + data.toString());
});
processing .stderr.on('data', function (data) {
console.log('stderr: ' + data.toString());
});
processing .on('exit', function (code) {
console.log('code ' + code.toString());
});

摘要:

🎯目标:在控制台中获取此结果

10% converted
15% converted
20% converted
100% converted...

❌错误:我得到的:

100% converted
//Sometimes I get an empty string because it is the last line of the .exe script

在标记为重复之前,我确信堆叠流中没有人回答对我有效

您需要将ffmpeg与ffmpeg进度包装器一起使用。附加事件";进步;并获得";进步;所有物

process.on('progress', (progress) => console.log(JSON.stringify(progress.progress));

它从0变为1,因此您需要设置一些调整。

最新更新