如何使用 ffmpeg 使用音频文件替换视频文件中的音频?
我想象命令如下所示:
ffmpeg -i v.mp4 -i a.wav -MAGIC video-new.mp4
这非常类似于如何用多个音频流替换视频文件中的单个音频流?但是该问题处理多个音轨,这使问题变得非常复杂,使得不清楚解决方案的哪一部分足以进行简单的音频交换。
答案1
您可能希望复制视频流而不重新编码以节省大量时间,但重新编码音频可能有助于防止不兼容:
ffmpeg -i v.mp4 -i a.wav -c:v copy -map 0:v:0 -map 1:a:0 new.mp4
-map 0:v:0
0
将输入中的第一个(索引)视频流映射到0
输出中的第一个(索引)视频流。
-map 1:a:0
1
将输入中的第二个(索引)音频流映射到0
输出中的第一个(索引)音频流。
如果音频比视频长,您需要-shortest
在输出文件名前添加。
如果不指定音频编解码器,将自动选择一个可用的编解码器。您可以通过-c:a libvorbis
在 后添加 来指定一个-c:v copy
。您还可以使用-c copy
来避免重新编码音频,但这在过去导致了兼容性和同步问题。
答案2
如果您的视频文件包含字幕轨道或多个音轨,@qubodup 的上述解决方案将丢弃字幕轨道,但保留视频中所有非第一个音轨。在这种情况下,您应该使用以下命令行作为更通用的解决方案:
ffmpeg -y -i v.mp4 -i a.m4a -c copy -map 0 -map -0:a -map 1:a video-new.mp4
这会将视频文件中的所有音轨替换v.mp4
为音频文件中的所有音轨a.m4a
,同时保持包括视频轨道和字幕轨道在内的所有其他轨道完好无损。
为了更好地理解,-map 0
从第一个输入文件(索引从 开始0
)中选择所有轨道(包括所有音频/视频/字幕轨道);-map -0:a
从第一个输入文件中删除所有音轨;-map 1:a
从第二个输入文件中选择所有音轨。具体来说,1:a:0
表示第二个输入文件(第一个“1”)的第一个(最后一个“0”)音轨(中间的“a”),丢弃第三个数字(即变成1:a
)表示所有那种类型的轨道(音轨),丢弃第二个数字(即变成1
)表示所有类型的轨道。-ve 符号表示减法。
关于FFMPEG-map
选项的详细解释,可以参考FFMPEG 高级选项