ffmpeg 循环淡入淡出至指定长度

ffmpeg 循环淡入淡出至指定长度

要求插入 BGM 到视频 ,还要让用户选择淡出或者淡入或者两者皆有。

更过分的是要求循环播放,循环播放可以用 ffmpeg 命令对已经处理好的单首BGM合并到视频 进行循环。

可是呢,音频插入到视频中,是用第三方库来实现的,故我很绝望呀。

现在的要求变成合并 N 首相同的 BGM 为一首。

这个也不难,就是有 N 首 BGM 就需要花费 N × 每一首处理时间,时间花费有点多。

但实现起来难度较少,对 N 首来说,我们可以直接选择循环来拼接 ffmpeg 命令就是了。。。。

音频长度小于视频长度时

  • 设有 N 首相同的 BGM
yes
no
no
初始化
音频长度>视频长度
音频最大长度:end = videoLength
淡入位置 fadei = 0 + 5
淡出位置 fadeo = end - 5
音量调整
audioes = videoLength / audioLength
videoLength % audioLength == 0 ?
audioes = audioes + 1
n-1 首音频中
淡入: fadei = 0 + 5
淡出: fadeo = audioLength - 5
第 n 首音频中
淡入: fadei = 0 + 5
淡出: fadeo = videoLength - (n-1) * audioLength - 5
  1. 假设 BGM 长度为 88 sec ,视频长度为 120 sec
  2. 那么根据上述流程图走下来,需要2首 BGM
    N-1 首的 BGM 都在 0 sec 开头淡入 5 sec , 82 sec 位置淡出 5 sec
  3. 那么我们只需要确定第 N 首 BGM 在哪里淡出即可 根据公式
    fadeo = videoLength - (n-1) * audioLength - 5
    确定淡出位置 为 120 -(2-1)* 88 - 5 = 27 sec 淡出
  4. 至于剩余的音频部分,可以不再处理,因为淡出后,后面的音频都是静音的
  5. 如果对音频文件有要求的话,可以使用 atrim=0:27 来截取 0-27 sec 的音频
  6. 最后使用 concat 来拼接两首 BGM
ffmpeg -i bgm2.mp3  -i bgm2.mp3  -filter_complex "[0:a]afade=t=in:ss=0:d=5[a1];\
[a1]afade=t=out:st=82:d=5[outa];\
[1:a]afade=t=in:ss=0:d=5[b1];\
[b1]afade=t=out:st=27:d=5[outb];\
[outa][outb]concat=n=2:v=0:a=1[outv];\
[outv]volume=0.2" \
t.mp3

音频长度大于视频长度时

这个没什么好说的,淡出位置 = 视频长度 - 5 sec 就可以了。

ffmpeg -i bgm2.mp3  -filter_complex "[0:a]afade=t=in:ss=0:d=5[a1];[a1]afade=t=out:st=88:d=5;" t.mp3

评论

此博客中的热门博文

ffmpeg 音频淡出淡出并调整音量

ffmpeg-filter 使用指南