猿问

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

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


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


我已经尝试了所有方法:spawn fork exec并且所有方法都将过程输出的最后一行返回给我。我想要一个已写入的每一行的实时流,以显示进度百分比。


我试过了:



const {fork} = require('child_process')

    const forked = fork('ffmpeg -i video.mp4');

    forked.on('message', (msg) => {

        console.log(msg);

})

执行备选方案 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);

})

执行备选方案 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

在标记为重复之前,我确定在 STACKOVERFLOW 中没有一个答案适合我


白衣染霜花
浏览 368回答 1
1回答

holdtom

您需要将 ffmpeg 与ffmpeg-progress-wrapper一起使用。附加事件“进度”并获取“进度”属性。process.on('progress', (progress) => console.log(JSON.stringify(progress.progress));它从 0 到 1,因此您需要进行一些调整。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答