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

123*_*567 5 audio ffmpeg

我们如何从音频文件中使用 ffmpeg 创建循环音频?

用于循环音频的命令是

ffmpeg -lavfi "amovie=audio.wav:loop=3" out.wav
Run Code Online (Sandbox Code Playgroud)

但这会创建整个音频的循环文件,而不是其中的一部分。

我需要的是:如果音频文件的持续时间为 4 分 30 秒,我想获取 2 分 25 秒到 3 分 55 秒的部分音频并循环播放

我怎样才能做到这一点?

slh*_*hck 5

选项 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
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,请注意以下设置:

  • 输入从 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 个样本。由于您不知道输入采样率,因此您必须首先使用asetrate滤波器将其设置为 48,000 Hz 。

如果有更简单的方法,我很高兴知道它,但不幸的是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
Run Code Online (Sandbox Code Playgroud)

在这里,输入没有被修剪;它只是确定循环长度的循环大小。但是,您必须使用 指定总输出持续时间(即 6 秒)-t。如果您想要不同的偏移量,请使用ffmpeg -ss <timestamp> -i input.m4a,其中<timestamp>是查找点。