我有大约 100 个视频(一系列的剧集)两次。
- [avi] 720p 视频分辨率,带有我喜欢的音轨
- [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 批处理文件循环中运行命令的示例。