Node脚本使用fluent-ffmpeg处理含空格MP4元数据失败问题
解决fluent-ffmpeg处理带空格元数据的问题
我之前也踩过完全一样的坑!问题核心在于你对fluent-ffmpeg参数传递逻辑的误解——它和直接在命令行敲ffmpeg命令的规则不一样,手动加引号、转义空格反而会打乱参数解析逻辑,导致报错。
错误原因
当你把'-metadata album="Some title"'或者手动转义的字符串放进outputOptions数组时,fluent-ffmpeg会把整个字符串当作一个独立的命令行参数传给ffmpeg。这时候ffmpeg会把引号当成元数据值的一部分,或者错误拆分参数,自然触发解析错误。
正确的两种写法
方法1:用fluent-ffmpeg内置的metadata()方法(推荐)
这个方法专门用来设置元数据,完全不用处理空格、引号的问题,直接传键值对即可:
const ffmpeg = require('fluent-ffmpeg'); ffmpeg('input.mp4') .output('output.mp4') // 单个元数据设置 .metadata('title', 'Some title with spaces') .metadata('album', 'My Favorite Album') // 或者批量设置多个元数据 .metadata({ artist: 'Jane Smith', year: '2024' }) .outputOptions('-c copy') // 复制流,避免重新编码 .on('end', () => console.log('文件处理完成!')) .on('error', (err) => console.error('出错了:', err)) .run();
方法2:正确使用outputOptions数组
如果一定要用outputOptions,记得每个-metadata选项单独作为数组元素,值里的空格直接保留,不需要加任何引号或转义:
ffmpeg('input.mp4') .output('output.mp4') .outputOptions([ '-metadata title=Some title with spaces', '-metadata album=My Favorite Album', '-c copy' ]) .on('end', () => console.log('文件处理完成!')) .on('error', (err) => console.error('出错了:', err)) .run();
额外提醒
确保你的fluent-ffmpeg是最新版本,旧版本可能存在参数传递的兼容性问题,可以用npm update fluent-ffmpeg更新后再试。
内容的提问来源于stack exchange,提问作者dansumption
相关产品推荐
相关产品推荐

