使用ffmpeg - nodejs区分错误和标准终端日志

Gui*_*uig 8 ffmpeg stdout stderr node.js

我ffmpeg在节点js中使用.标准终端输出和错误似乎都被发送到stdout,所以我不知道如何区分错误和成功...这是我的代码:

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); });
}
Run Code Online (Sandbox Code Playgroud)

转换成功或失败,stdout为空,stderr包含我在终端中运行相应命令时会得到的内容

Har*_*ren 18

Ffmpeg将所有日志记录数据输出到stderr,以便stdout自由地将输出数据传递给其他程序或其他ffmpeg实例.

将ffmpeg作为自动进程运行时,通常会提供选项

-loglevel error
Run Code Online (Sandbox Code Playgroud)

这使得它在正常情况下完全静音,并且仅输出错误数据(到stderr),这通常是您对命令行程序的期望.


Gui*_*uig 2

受 @aergistal 评论的启发,这是一个适合我的解决方案,其中回调将在任务结束时执行,并function(error, success)像往常一样使用签名。

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});
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

或者使用新的 js 风格:

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');
...
Run Code Online (Sandbox Code Playgroud)