Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Differentiate between error and standard terminal log with ffmpeg - nodejs

I'm using ffmpeg in node js. Both the standard terminal output and the error seems to be sent to stdout, so I don't know how to differentiate between error and success... Here's my code:

var convertToMp3 = function(filePath) {
  var ffmpeg = child_process.spawn('ffmpeg',['-i', filePath, '-y', 'output.mp3']);
  var err = '';
  ffmpeg.stderr
    .on('data', function(c) { err += c; })
    .on('end', function() { console.log('stderr:', err); });
  var d = '';
  ffmpeg.stdout
    .on('data', function(c){d +=c;})
    .on('end', function(){ console.log('stdout', d); });
}

wether the conversion succeeds or fails, stdout is empty and stderr contains what I'd get if I'd run the corresponding command in the terminal

like image 583
Guig Avatar asked Feb 03 '16 06:02

Guig


2 Answers

Ffmpeg outputs all of its logging data to stderr, to leave stdout free for piping the output data to some other program or another ffmpeg instance.

When running ffmpeg as an automatic process it's often useful give the option

-loglevel error

which turns it completely mute in a normal scenario and only outputs the error data (to stderr), which is normally what you would expect from a command-line program.

like image 119
Harald Nordgren Avatar answered Nov 05 '22 22:11

Harald Nordgren


Inspired by @aergistal comment, here is a solution that works for me, where callback is to be executed at the end of the task, with the signature function(error, success), as usual.

var convertToMp3 = function(filePath, callback) {
  var ffmpeg = child_process.spawn('ffmpeg',['-i', filePath, '-y', 'output.mp3']);
  var err = '';
  ffmpeg.stderr.on('data', function(c) { err += c; }).on('end', function() { console.log('stderr:', err); });

  ffmpeg.on('exit', function(code) {
    if (code) {
      callback({code: code, message: err});
    } else {
      callback(null, {success: true, message: err});
    }
  });
}

or in the new js style:

const convertToMp3 = (filePath) => new Promise((resolve, reject) {
  const ffmpeg = child_process.spawn('ffmpeg', ['-i', filePath, '-y', 'output.mp3']);
  let output = '';
  ffmpeg.stderr
    .on('data', c => { output += c; });

  ffmpeg.on('exit', code => {
    if (code) {
      reject({ code: code, message: output });
    } else {
      resolve(output);
    }
  });
});

const ffmpegOutput = await convertToMp3('./video.mp4');
...
like image 35
Guig Avatar answered Nov 05 '22 21:11

Guig