FFmpeg转换多轨MP4指定音频轨道问题求助
嗨,我来帮你揪出这个问题的根源!你的需求很明确:保留原有的英语AAC音轨不动,只把法语DTS音轨转成EAC-3,但当前命令却把两个音轨都转成EAC-3了,大概率是两个原因之一,咱们一个个说:
最可能的原因:MP4容器不支持DTS编码
这是很多人容易踩的坑——MP4格式的容器本身不支持DTS编码的音频轨道!
如果你搞反了输入轨道的编号(比如你以为0:1是英语AAC,但实际上它是法语DTS),那你写的-map 0:1 -c:a copy根本无法生效:FFmpeg发现要把DTS音轨塞进MP4容器,会自动触发转码(默认转成兼容的编码,比如EAC-3),结果就出现了两个音轨都变成EAC-3的情况。
你可以先执行这个命令确认输入文件的轨道详情:
ffmpeg -i input.mp4
输出里会明确列出每个轨道的编码、语言和编号,比如:
Stream #0:0(eng): Video: h264 ... Stream #0:1(fra): Audio: dts (DTS) ... Stream #0:2(eng): Audio: aac (LC) ...
这样你就能清楚知道哪个编号对应哪个音轨了。
第二个可能:编码参数的作用范围问题
如果你的轨道编号没搞错(0:1确实是英语AAC),那问题出在FFmpeg的参数处理逻辑上:当你在后面设置-c:a eac3时,它会作为全局音频编码参数,覆盖之前的-c:a copy设置,导致所有音频轨道都用这个编码。
解决办法是针对每个输出的音频轨道单独指定编码参数,比如用-c:a:0 copy(第一个输出音轨保留原编码)、-c:a:1 eac3(第二个输出音轨转成EAC-3)的写法,这样就不会互相影响了。
修正后的命令
方案1:确认轨道编号后精准映射
假设你通过ffmpeg -i input.mp4确认了:
0:0是视频轨道0:1是英语AAC音轨0:2是法语DTS音轨
那修正后的命令是:
ffmpeg -hide_banner -i input.mp4 ^ -map_metadata -1 ^ -map 0:0 -c:v copy ^ -map 0:1 -c:a copy ^ -map 0:2 -c:a eac3 -b:a 1536k ^ -metadata:s:a:0 language=eng ^ -metadata:s:a:0 title="Stereo" ^ -metadata:s:a:1 language=fra ^ -metadata:s:a:1 title="Stereo" ^ output.mp4
方案2:按语言映射(更稳妥,不怕轨道编号变)
直接通过语言来指定要映射的音轨,不用记编号,更靠谱:
ffmpeg -hide_banner -i input.mp4 ^ -map_metadata -1 ^ -map 0:v:0 -c:v copy ^ -map 0:a:m:language:eng -c:a copy ^ -map 0:a:m:language:fra -c:a eac3 -b:a 1536k ^ -metadata:s:a:0 language=eng ^ -metadata:s:a:0 title="Stereo" ^ -metadata:s:a:1 language=fra ^ -metadata:s:a:1 title="Stereo" ^ output.mp4
额外提醒
如果你的需求是保留DTS音轨,那不能输出到MP4容器,得换成MKV(MKV支持几乎所有编码),把输出文件名改成output.mkv即可。
备注:内容来源于stack exchange,提问作者Shaun.M

