Node.js child_process.spawn调用FFmpeg转码异常退出,返回码1无报错输出
问题根因
看不到错误输出的核心原因是FFmpeg参数设置了-loglevel 8:FFmpeg的日志等级中,数值8对应quiet模式,会屏蔽所有错误、警告、常规输出,所以即使转码出错也不会往stderr打印任何内容。
除此之外代码还存在变量名错误:error事件回调参数名为err,但回调内打印的是未定义的error变量,会引发额外的上下文错误。
修复方案
1. 调整日志等级输出错误信息
把-loglevel的参数从8改成error/warning/info,确保错误信息可以正常输出到stderr:
const cp = require('child_process'); const ffmpeg = require('ffmpeg-static'); const process = cp.spawn(ffmpeg, [ // loglevel设为error仅输出错误信息,设为info可查看完整执行日志 '-loglevel', 'error', '-hide_banner', '-i', 'output.webm', "output.ogg", ], { windowsHide: false, });
2. 修正事件回调变量名错误
统一error事件回调内的变量名,避免未定义报错:
process.on('error', (err) => { console.log('Failed to start subprocess.', err); });
3. 排查转码逻辑常见问题
调整日志等级后重新执行代码,即可从stderr看到具体的转码错误,常见的转码失败原因如下:
- 当前工作目录已存在
output.ogg且被其他进程占用,FFmpeg默认不会覆盖已有文件,可添加-y参数允许自动覆盖输出文件:const process = cp.spawn(ffmpeg, [ '-loglevel', 'error', '-hide_banner', '-y', // 新增自动覆盖输出文件参数 '-i', 'output.webm', "output.ogg", ], { windowsHide: false, }); - webm文件内的音视频编码格式不兼容ogg封装,需要额外指定对应的音视频编码器参数。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

