使用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数据stderr
到stderr
,将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'); ...