【发布时间】:2018-03-14 14:07:47
【问题描述】:
最近我不得不使用 FFMPEG 进行一些工作,有时我很难理解应该使用哪些命令/过滤器来实现我的目标,这篇文章仅用于分享我在此过程中获得的知识,特别是在处理音频文件并将其插入视频的过程。
我需要在特定位置和特定持续时间用新音频文件替换视频的音频,最好在音频结束时淡出,以下是我的问题的解决方案及其解释。
【问题讨论】:
标签: audio video ffmpeg video-processing
最近我不得不使用 FFMPEG 进行一些工作,有时我很难理解应该使用哪些命令/过滤器来实现我的目标,这篇文章仅用于分享我在此过程中获得的知识,特别是在处理音频文件并将其插入视频的过程。
我需要在特定位置和特定持续时间用新音频文件替换视频的音频,最好在音频结束时淡出,以下是我的问题的解决方案及其解释。
【问题讨论】:
标签: audio video ffmpeg video-processing
这是完整的命令,提供了一个名为 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)。
【讨论】:
见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
【讨论】: