使用ffmpeg – nodejs区分错误和标准terminal日志

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

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

如果转换成功或失败,则标准输出为空,并且标准错误包含如果我在terminal中运行相应的命令

Ffmpeg将其所有日志logging数据stderrstderr ,将stdout保留为空闲状态,用于将输出数据输送到其他程序或ffmpeg实例。

将ffmpeg作为自动进程运行时,通常会提供选项-loglevel error ,使其在正常情况下完全静音,并且只输出错误数据(stderr),这通常是您对命令行程序的期望。

受@aergistal评论的启发,这里是一个适用于我的解决scheme,在任务结束时执行callback,像往常一样使用签名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}); } }); } 

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