ffmpeg 视频文件添加音频

0 / 1324

音视频合并

音视频合并最简单的用法就是一个视频文件、一个音频文件,然后将这两个流进行合并。

对应命令如下:

ffmpeg \
-i video_no_audio.mp4 \
-i you.flac \
-c:v copy \
-map 0:v \
-map 1:a \
-y
video_with_audio.mp4 \
Note
由于我们没有修改视频流,因此我们可以直接使用 -c:v copy 来实现视频流复制,避免重新编码缩短执行时间。

音轨替换

另一种情况是,视频文件本身就存在音频。但是我们想使用某个特定的音频文件替换原视频中的音频。

此时,我们就需要借助 -map 映射参数来实现。使用 -map 参数从两个流媒体文件中分别提取视频流和音频流并将这两个流进行合并即可:

ffmpeg \
-i video_with_audio.mp4 \
-i water.flac \
-c:v copy \
-map 0:v \
-map 1:a \
-y \
video_replace_audio.mp4

关于音视频长度问题

这里需要注意的是,假如视频(video_with_audio.mp4)长度为 60s,而音频(water.flac)长度只有 30s,在输出视频文件(video_replace_audio.mp4)时,FFmpeg 会选择与时长最长(-longest)的那个输入流保持一致,也就是说视频 video_replace_audio.mp4 时长为 60s,只不过从 30s 之后都没有声音而已。

如果你想要选择与最短的那个输入流保持一致,应该加上 -shortest 参数:

ffmpeg \
-i video_with_audio_60s.mp4 \
-i water_30s.flac \
-c:v copy \
-map 0:v \
-map 1:a \
-shortest \
-y \
video_replace_audio_30s.mp4

此时输出的视频文件长度就为 30s 了。

视频添加空音轨

除了将音频文件合并到视频中之外,还可以直接对视频添加一个(无声的)空音轨:

ffmpeg \
-i video_no_audio.mp4 \
-f lavfi -i anullsrc \
-c:v copy \
-shortest \
-map 0:v \
-map 1:a \
-y \
video_empty_audio.mp4

命令中的 -f lavfi -i anullsrc 用于生成一个无限长度的虚拟音频源。因此,我们需要加上 -shortest 参数以输出与原视频保存一样的时长。否者,将会创建一个无限时长的视频文件。

多音轨

经常在电影院看大型巨作时都会发现,一个视频通常有多种音频语言。比如英文音频,又或者中文音频。

不管有多少音轨,其本质都是视频容器中的一个流而已。想要实现这种效果我们只需要将目标音频流打包到视频文件中即可:

ffmpeg \
-i video_with_audio.mp4 \
-i water.flac \
-c:v copy \
-map 0:v \
-map 0:a \
-map 1:a \
-y \
video_with_multi_audio.mp4

不过,在播放时需要注意,视频播放器不会同时播放所有的音频,默认会选择第一个音频。如果你想要选择第二个音频需要手动选择。

合并多个音频文件

前面只是从一个音频文件中提取音频,事实上可以从多个音频文件中提取音频流。

命令如出一辙,只是多了几个映射而已:

ffmpeg \
-i video_with_audio.mp4 \
-i fall.mp3 \
-i water.flac \
-c:v copy \
-map 0:v \
-map 0:a \
-map 1:a \
-map 2:a \
-y \
video_with_multi_audio.mp4

混音

这种用法随处可见,在看电视剧或电影时通常会发现角色在交流时都会有对应的背景音乐烘托场景环境。这其实都是后期制作,也是典型的混音。

实现这种效果的命令如下:

ffmpeg \
-i video_with_audio.mp4 \
-i water.flac \
-c:v copy \
-filter_complex " \
    [0:a] [1:a] amix=inputs=2:dura