高效地将 avi 中的音轨合并到 mp4

高效地将 avi 中的音轨合并到 mp4

我有大约 100 个视频(一系列的剧集)两次。

  1. [avi] 720p 视频分辨率,带有我喜欢的音轨
  2. [mp4] 1080p 但语言错误

显然,我希望使用我喜欢的语言制作的精彩视频。但如果可能的话,我希望保留这两种音频选项。

我尝试使用 mp4 合并器(mp4box 的 GUI)手动合并它们,但这需要很长时间。我很想看到一些自动化和优化该过程的建议。

答案1

你可以很容易地做到这一点ffmpeg(下载静态构建)如下所示:

ffmpeg -i input.mp4 -i input.avi -c copy -map 0:v:0 -map 1:a output.mp4

这会地图以下流到输出文件:

  • 第一个输入的第一个视频通道(0:v:0
  • 第二个输入的音频通道(1:a) – 如果您只想要第一个,请使用1:a:0,等等。

视频和音频流都被复制了,所以这个过程很快。

音频不兼容

如果 AVI 文件使用 MP3 作为音频流,则无法将其映射到 MP4 文件。在这种情况下,请使用:

ffmpeg -i input.mp4 -i input.avi -c:v copy -c:a aac -b:a 192k -map 0:v:0 -map 1:a output.mp4

这将使用 192 kBit/s 的 AAC 重新编码音频流,其质量应该足够高,您不会注意到重新编码产生的任何伪影。

或者,您可以使用 MKV 作为输出容器,它几乎支持任何编解码器:

ffmpeg -i input.mp4 -i input.avi -c copy -map 0:v:0 -map 1:a output.mkv

如何批量运行

显然,您可以在循环中使用此命令对所有文件运行它,例如在 Linux 下使用 Bash,假设 MP4 和 AVI 文件具有相同的基本名称,并且您只运行一次(否则它也会尝试转换其输出文件):

for f in *.mp4; do
    aviFile="${f%%.mp4}.avi" # replace the extension
    outputFile="${f%%.mp4}-output.mp4" # create output filename
    ffmpeg -i "$f" -i "$aviFile" -c copy -map 0:v:0 -map 1:a "$outputFile"
done

您将在网上找到很多关于如何在 Windows 批处理文件循环中运行命令的示例。

相关内容