Node.js环境下使用fluent-ffmpeg添加多字幕的问题求助
问题根因
你多次传入-vf参数的写法不符合FFmpeg的参数规则,FFmpeg遇到重复的-vf参数时,只会保留最后一个生效,因此第一个字幕的渲染规则被覆盖,仅第二个字幕生效。
解决方案
根据你的需求可选择以下两种实现方案:
场景1:硬烧录多字幕到视频画面
这种场景下字幕会直接嵌入视频画面,无法被播放器关闭或切换,适合需要强制显示字幕的场景。
你需要将多个字幕滤镜合并到同一个-vf参数中,用逗号分隔即可,代码示例:
ffmpeg() .addInput("./sample3.mp4") .addInput("merged.wav") // 两个字幕滤镜合并为一个vf参数,先渲染114.srt再叠dd.srt,顺序可以根据需求调整 .outputOptions( "-vf subtitles=./subt/114.srt:force_style='Alignment=10,FontName=QCF2604,Fontsize=18,MarginL=5,MarginV=25,Outline=0',subtitles=dd.srt:force_style='Alignment=1,FontName=QCF2604,Fontsize=18,MarginL=5,MarginV=25,Outline=0'" ) .outputOptions("-shortest") .output("./test.mp4") .on("end", function () { console.log("conversion ended"); callback(null); }) .on("error", function (e) { console.log("error: ", e.code, e.msg, e); callback(e); }) .run();
场景2:封装多软字幕轨道(对应你给出的原生FFmpeg命令效果)
这种场景下字幕是独立的轨道,用户可以在播放器中切换、关闭字幕,输出建议使用MKV格式(MP4对SRT软字幕的兼容性较差),代码示例:
ffmpeg() .addInput("./sample3.mp4") // 输入0:视频 .addInput("merged.wav") // 输入1:音频 .addInput("./subt/114.srt") // 输入2:第一个字幕 .addInput("dd.srt") // 输入3:第二个字幕 // 映射所有需要的流:视频、音频、两个字幕 .outputOptions("-map 0:v -map 1:a -map 2 -map 3") // 编码设置:视频音频直接复制,字幕用srt编码 .outputOptions("-c:v copy -c:a copy -c:s srt") // 设置字幕轨道语言元数据,可根据实际字幕语言修改 .outputOptions("-metadata:s:s:0 language=chi") .outputOptions("-metadata:s:s:1 language=eng") .outputOptions("-shortest") // 软字幕建议输出为mkv格式 .output("./test.mkv") .on("end", function () { console.log("conversion ended"); callback(null); }) .on("error", function (e) { console.log("error: ", e.code, e.msg, e); callback(e); }) .run();
内容的提问来源于stack exchange,提问作者MBK
相关产品推荐
相关产品推荐

