![FFmpeg - 用间距集中音频文件](https://linux22.com/image/1454909/FFmpeg%20-%20%E7%94%A8%E9%97%B4%E8%B7%9D%E9%9B%86%E4%B8%AD%E9%9F%B3%E9%A2%91%E6%96%87%E4%BB%B6.png)
请看图片:
每个音频片段具有相同的编解码器/采样率,但持续时间不同,每个空间也不同。片段之间总是有空间,没有重叠。所以没有理由重新编码因为这基本上是一个流复制工作。这很重要,因为我应该保留每个剪辑的原始质量。
现在,假设我找到了我要找的东西。我给这个命令起了个假名“-开始时间”,它会在给定时间将剪辑插入音频流。使用此伪命令,我将设置每个剪辑的开始时间。其余工作应由 ffmpeg 命令/过滤器/脚本等完成。
ffmpeg -start_at 00.00 -i audio1.opus -start_at 06.30 -i audio2.opus -start_at 21.15 -i audio3.opus -start_at 26.35 -i audio4.opus
只是想想 ffmpeg 会自动用无声的声音填补空白。
那么,是否有一个 ffmpeg 命令/过滤器可以实现这个功能?或者一个 ffmpeg gui/脚本等?
答案1
FFmpeg 能够处理这个问题。你需要使用filter_complex
使用过滤器链。您可以使用aevalsrc
。要创建 5 秒的静音音频,
aevalsrc=0:d=5
因此以下命令将适合您。
ffmpeg -i input_audio_1 -i input_audio_2 -i input_audio_3 -filter_complex "
aevalsrc=0:d=10[s1];
aevalsrc=0:d=15[s2];
aevalsrc=0:d=20[s3];
[s2][1:a]concat=n=2:v=0:a=1[ac1];
[s3][2:a]concat=n=2:v=0:a=1[ac2];
[0:a][s1][ac1][ac2]amix=inputs=4[aout]" -map [aout] output_audio
这里我假设每个音频的长度为 5 秒,并且重新编码是可选的,例如,
-c:a libmp3lame -ac 2 -b:a 128k
作为amix
导致音频重叠,我在每个输入音频中添加了一个静音音频。您也可以尝试amerge
和adelay
其中文档本身有清晰的解释。
希望这对你有帮助!
答案2
以下是音频连接示例:
ffmpeg -y -f s16be -i /dev/zero -af "[in]anullsink;amovie=1.wav[a1];amovie=silence.wav[a2];amovie=2.wav[a3];amovie=4.wav[a4];[a1][a2][a3][a4]concat=n=4:v=0:a=1[out]" -shortest -t 12 output.wav
请注意这里有几件你需要知道的事情:
- 我从一个干净的输入开始
/dev/zero
,这很好,但是,可能有更好的方法来做到这一点。 - 制作剪辑之前你需要知道剪辑的总时长(
t=12
) - 我预先制作了
silence.wav
文件。您可以使用过滤器,例如anullsrc
(nb_samples
参见文档) 或者其他,但如果你问我,这确实很痛苦。 -shortest
有时,使用这种方法,FFmpeg 不知道何时停止,但是,由于应用了参数,它不会创建空的静音轨道。