我正在浏览一个电视连续剧,并根据自己的喜好编辑文件。我有一组有我想要的视频和一组有音频。我有一个可以运行的批处理文件,它从文件夹“A”中的每个文件中获取视频,从文件夹“B”中的每个文件中获取音频,并将其输出到名为“output”的文件夹中。但是对于这个特殊系列,这只是我需要完成的一半。
在“B”文件夹中每个文件集的末尾都有一些额外的东西。我想做的是从“A”获取音频和视频,从“B”获取音频,将它们全部合并到一个文件中,同时获取“A”和“B”文件,比较时间戳,然后添加从“B”到输出文件的额外视频。
让我换一种说法。让我们说“A”是带日语音频的1080p,长20分钟。假设“B”是带有英语音频的720p,长度为23分钟。我希望整个1080p视频都有两个音轨,加上720p视频拼接到最后。两个文件都从同一个位置开始,因此同步不是问题。问题是每集的时间差异都不同。所以有些剧集要长3分钟,有些只有30秒。有没有办法让ffmpeg或其他工具查看时间上的差异,只是将多余的内容添加到输出文件中?
很抱歉长篇大论。感谢您的帮助和指导。
答案 0 :(得分:0)
我假设A和B都同时启动,因此不需要初始同步传递。并具有相同的帧率。 A有所需的视频1080p,B最后有音频+附加功能。
ffmpeg -i A.mp4 -i B.mp4
-filter_complex
"[1][0]scale2ref[b][a];[b][a]overlay=eof_action=pass[v]"
-map "[v]" -map 0:a -map 1:a -crf 18 -c:a copy -movflags +faststart out.mp4
-i A.mp4 -i B.mp4
- 首先,我们向ffmpeg提供两个输入。
-filter_complex
- 如果我们希望有选择地将过滤器应用于多个输入或以某种相互依赖的方式处理它们,则会通过-filter_complex
设置过滤器图。将其整个参数括在引号中是最安全的。
[1][0]scale2ref[b][a]
- scale2ref过滤器将B视频缩放为与A视频相同的大小,即视频。然后将这两个输出传递给覆盖滤波器。
[b][a]overlay=eof_action=pass[v]
- A叠加在按比例放大的B之上。由于B现在与A的大小相同,A完全覆盖了基本视频B.当A终止时,B显示通过;添加eof_action以强制执行此操作 - 默认行为将是A的最后一帧重复直到B结束。此过滤器的输出标记为[v]
。
-map "[v]" -map 0:a -map 1:a
- 必须明确告知ffmpeg要在输出中包含哪些流,否则它会自动选择它们。这种情况不适合。包括叠加结果,音轨也是如此。
-c:v libx264
- 因为我们输出到MP4,默认编码器是libx264,这里没有指定,但可能对将来使用有用。
-crf 18
- 推荐的libx264编码模式是CRF。较小的值可以更好地保持源质量,但会生成更大的文件。 18到28是一个很好的范围。
-c:a copy
- 复制映射的音频流,即不进行再压缩。
-movflags +faststart
- 处理完成后,ffmpeg会将生成的MP4的索引移到其前面,这样在网络流媒体播放过程中,播放就会很快开始。如果文件不通过网络传输,则可以跳过。