前两天下载了一部动画片,下载好的目录里除了一个有声音和图像的 MP4 文件,还有一个普通话对白的 M4A 音频文件。今天费了些功夫,终于用 ffmpeg 把两个文件合并在一起,生成一个双音轨的视频文件。

差强人意

开始搜索了下怎样用 ffmpeg 把这个额外的音频合并到原有的 MP4 文件里去,敲了几个命令,结果不尽如人意,尝试了几次没有成功,退而求其次,把 MP4 文件里的视频和 M4A 音频合并在一起了,算是把 MP4 原本的音轨替换掉了。

ffmpeg -i original.mp4 -i mandarin.m4a -c copy -map 0:v:0 -map 1:a:0 output.mp4
  • original.mp4 是下载好的 MP4 文件
  • mandarin.m4a 是下载好的普通话对白 M4A 音频文件
  • output.mp4 是最终的输出文件
  • -map 0:v:0 中的第一个 0 表示(-i 指定的)第一个输入文件,v 表示需要的其中的视频内容,第二个 0 指定要的是文件里的第一个视频
  • -map 1:a:0 与上面类似,表示的是第二个(1)输入文件的第一个(0)音频(a)内容

最后得到的 output.mp4 不包含 MP4 文件原本的音频内容了,只有新合进去的音频。

这一节的标题“差强人意”我应该没用错,这个结果的确让我还算满意,几乎决定不再继续下去了。

各种失败的尝试

下面是最开始的几次失败尝试。

ffmpeg -i original.mp4 -i mandarin.m4a -acodec copy -vcodec copy output.mp4

结果跟原始文件基本一致。

考虑到 MP4 可能不支持多音轨——实际上是支持的,换用 mkv 作为输出格式,又做了一次尝试,结果表现仍然跟原始 MP4 文件一样。

ffmpeg -i original.mp4 -i mandarin.m4a -c copy output.mkv

最后的失败尝试,试了一个较为复杂的操作,从 MP4 文件里分离出视频和音频文件,再和已有的 M4A 文件一起合并。

ffmpeg -i original.mp4 -an -c:v copy video.mp4
ffmpeg -i original.mp4 -vn -c:a copy audio.m4a
ffmpeg -i video.mp4 -i audio.m4a -i mandarin.m4a -c copy output.mkv

仍然没得到“双音轨”。


Final

最终在做这份记录时,可能是理清了一些思路,忽然有了想法,通过几个 -map 参数分别指定一个视频流,两个音频流作为输入,合并为一个文件。

ffmpeg -i original.mp4 -i mandarin.m4a -c copy -map 0:v:0 -map 0:a:0 -map 1:a:0 output.mkv

终于达到了最初的目的,一部有画面,有英文音轨,有普通话音轨的动画片。