Bruno Freire
Bruno Freire

Reputation: 175

Electron and NodeJS: Execute shell command asyncronously with live stream

Electron: get file conversion percent in real-time:

I wanna run the command ffmpeg -i video.mp4 (example) to convert a video into another format. But I want to get the conversion percent that is streamed in the process output and get it in my Electron App or NodeJS.

I've tried all methods: spawn fork exec and all of them return me the last line of the process output. I want a LIVE Stream of each line that is been written, to show the percent progress.

I've tried:

Fork

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

Exec Alternative 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);

Spawn

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());
});

SUMMARY:

🎯Goal: Get this results in the console

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

❌Error: What I'm getting:

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

BEFORE MARK AS DUPLICATE, I'M SURE NO ONE ANSWER IN STACKOVERFLOW WORKED FOR ME

Upvotes: 2

Views: 1672

Answers (1)

Iago Calazans
Iago Calazans

Reputation: 328

You need to use ffmpeg with ffmpeg-progress-wrapper. Attach on event "progress" and get the "progress" property.

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

It goes from 0 to 1, so you will need to set some adjusts.

Upvotes: 2

Related Questions