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

Node.js 使用ffmpeg-nodejs区分错误和标准终端日志,node.js,ffmpeg,stdout,stderr,Node.js,Ffmpeg,Stdout,Stderr,我在node js中使用ffmpeg。标准终端输出和错误似乎都被发送到标准输出,所以我不知道如何区分错误和成功。。。这是我的密码: var convertToMp3 = function(filePath) { var ffmpeg = child_process.spawn('ffmpeg',['-i', filePath, '-y', 'output.mp3']); var err = ''; ffmpeg.stderr .on('data', function(c) {

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

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

无论转换成功还是失败,stdout都是空的,并且stderr包含如果我在终端中运行由@aergistal comment启发的相应命令所得到的内容,这里有一个对我有效的解决方案,其中回调将在任务结束时执行,并带有签名
函数(错误,成功)
,像往常一样

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});
    }
  });
}
或者使用新的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');
...

Ffmpeg将其所有日志数据输出到
stderr
,以使
stdout
可以自由地通过管道将输出数据传输到其他程序或其他Ffmpeg实例

当将ffmpeg作为自动进程运行时,提供选项通常很有用

-loglevel error

在正常情况下,它将完全静音,并且只输出错误数据(到stderr),这通常是您从命令行程序中所期望的。

stdout
是为数据保留的。如果只需要知道流程是否失败和/或解析
stderr
输出,请检查流程退出代码。我喜欢它。关于如何在成功退出后返回“已实现”的承诺的任何提示?您的意思是将基于回调的函数转换为承诺?看我的编辑。你为我节省了很多时间,谢谢!