我们如何使用 ffmpeg 从音频文件创建循环音频?
用于循环音频的命令是
ffmpeg -lavfi "amovie=audio.wav:loop=3" out.wav
但这会创建整个音频的循环文件,而不是其中的一部分。
我需要的是:如果音频文件的持续时间为 4 分 30 秒,我想要获取音频的 2 分 25 秒到 3 分 55 秒的部分并循环播放
我怎样才能做到这一点?
答案1
选项 1——修剪和循环
您可以使用atrim
过滤器首先将输入修剪为所需的部分,然后使用aloop
过滤器循环该部分。
ffmpeg -i input.m4a \
-filter_complex " \
[0:a] \
atrim=0:3,asetpts=PTS-STARTPTS, \
asetrate=48000,aloop=2:size=3*48000 \
[outa]" \
-map "[outa]" \
-c:a aac \
out.m4a
在上面的示例中,请注意以下设置:
- 输入从 0 秒到 3 秒切断
atrim
- 剪切部分播放 3 次(
aloop=2
- 您将获得一次原始音频和两次循环) - 循环的大小设置为
size=3*48000
- 音频编解码器为 AAC,采用默认质量选项 (
-c:a aac
)
如果您想要不同的持续时间,例如从 5 秒到 10 秒,请更改atrim=5:10
,然后更改size=5*48000
。
不幸的是,aloop
过滤器需要设置循环部分的大小(以样本为单位)——在我们的例子中,即 3 秒 ⨉ 48,000 个样本。由于您不知道输入采样率,因此必须先使用过滤器将其设置为 48,000 Hz asetrate
。
如果有更简单的方法,我会很高兴知道,但不幸的是amovie
输入源不允许动态修剪。
选项 2 — 循环,然后停止
另一种选择可能是:
ffmpeg -ss 0 -i input.m4a \
-filter_complex " \
[0:a]asetrate=48000,aloop=1:size=3*48000[outa]" \
-map "[outa]" \
-t 6 \
-c:a aac \
out.m4a
这里,输入没有被修剪;只是循环大小决定了循环的长度。但随后您必须使用 指定总输出持续时间(即 6 秒)-t
。如果您想要不同的偏移量,请使用ffmpeg -ss <timestamp> -i input.m4a
,其中<timestamp>
是搜索点。
答案2
由于您没有使用复杂的管道,您也可以使用简单的过滤器链来完成此操作:
ffmpeg -i audio.wav -af 'atrim=2*60+25:duration=80,aloop=3:size=44100*80' out.wav