前两天下载了一部动画片,下载好的目录里除了一个有声音和图像的 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
终于达到了最初的目的,一部有画面,有英文音轨,有普通话音轨的动画片。