使用 ffmpeg 从音频的某一部分创建循环音频

使用 ffmpeg 从音频的某一部分创建循环音频

我们如何使用 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

相关内容