最近我不得不与FFMPEG一起工作,有时我努力想要了解我应该使用哪些命令/过滤器来实现我的目标,这篇文章仅用于分享我在此过程中获得的知识,特别是操纵音频文件并将其插入视频的过程。
我需要用一个新的音频文件替换视频的音频,在特定的位置,并且具有特定的持续时间,最好在音频结束时淡出音频,下面是我的问题的解决方案解释
答案 0 :(得分:1)
这是完整的命令,提供了一个名为vinput.mp4的输入视频文件和一个名为ainput.wav的音频文件:
ffmpeg -y -i vinput.mp4 -i ainput.wav -filter_complex "\
[1:a]aloop=-1:2e+09[aloop];\
[aloop]aformat=channel_layouts=mono,atrim=end=2[atrim];\
[atrim]adelay=2000[afinal];\
[afinal]afade=t=out:st=3.5:d=0.5[afinal]" \
-shortest -map "[afinal]" -map 0:v output.mp4
以下是每个步骤的解释:
[1:a]aloop=-1:2e+09[aloop]
将无限次循环我的音频(-1),并重复可能的最大帧数(2e + 09)(我没有找到告诉命令完全重复音频的方法。 ..
[aloop]aformat=channel_layouts=mono,atrim=end=2[atrim]
这将从前一条指令( aloop )获取循环音频,并且主要将其修剪为仅持续2秒。
[atrim]adelay=2000[afinal]
这会将音频的开始延迟2000毫秒(2秒),使其在视频的第二秒开始播放。
[afinal]afade=t=out:st=3.5:d=0.5[afinal]
这将淡出我们的音频,在视频的第4秒开始淡出,并使淡出持续0.5秒,意味着声音将从第二个3.5到4淡出。
-shortest
由于我们有一个无限期重复的音频流,我们需要告诉ffmpeg何时停止编码,这是由标签完成的,它告诉ffmpeg我们期望最终结果能够持续最短的输入它收到(在视情况下,视频输入)。
-map "[afinal]" -map 0:v
正如在Samuel Williams中指出his answer,这个选项指示ffmpeg我们要复制到生成的输出的流,在这种情况下,我们希望同时拥有最终的音频(afinal)和源视频流(0:v)。
答案 1 :(得分:0)
请参阅https://stackoverflow.com/a/12943003/6917520
-map选项指示ffmpeg您想要的流。要复制input_0.mp4中的视频和input_1.mp4中的音频:
$ ffmpeg -i input_0.mp4 -i input_1.mp4 -c copy -map 0:0 -map 1:1 -shortest out.mp4