ffmpeg - 替换视频中的音频

ffmpeg - 替换视频中的音频

如何使用 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:00将输入中的第一个(索引)视频流映射到0输出中的第一个(索引)视频流。

-map 1:a:01将输入中的第二个(索引)音频流映射到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 高级选项

相关内容