使用 ffmpeg 将任意音频片段添加到现有视频

使用 ffmpeg 将任意音频片段添加到现有视频

(编辑:请参阅下面的修复版本)

我正在开发一款用于制作视频和动画的应用。用户可以添加文本和视频元素。我已经开发了一个渲染器,它可以生成帧并使用 ffmpeg 创建视频,但现在我想添加用户添加的视频片段中的音频。

例如,用户可能会将一段时长为 10 秒的视频 (subclip.mp4) 嵌入到动画中。他们还可以剪辑视频,使其从 subclip.mp4 的第 5 秒开始,在第 10 秒结束。

所以我需要添加音频:

  • 音频来自视频(subclip.mp4)
  • 音频取自 subclip.mp4 中的 5s-10s
  • 生成的视频中的音频从 10 秒开始(播放 5 秒)。

我希望我可以使用类似的东西:

ffmpeg -i main-video.mp4 -i subclip.mp4 \
  -filter_complex "[1:a]atrim=5:10;[1:a]adelay=5000"
  ...

显然,这不起作用。修剪似乎做了正确的事情,但我似乎无法将其放置在视频中的正确位置。我也玩过 asetpts,但它似乎什么也没做。

最后,我想将所有音频合并为一个音轨。尝试过 concat 和 map 进行合并,但同样没有成功。

编辑

成功了。这是工作命令。它包括一个视频、一个完整的背景音轨(1.mp3)和一个音频叠加(2.mp4)。叠加为 3.3 秒,从视频开始的 3.15 秒开始:

ffmpeg -y -f concat -i video.mp4 -i 1.mp3 -i 2.mp4 \
  -filter_complex \
  "[1:a]atrim=0:11.83,apad=whole_dur=11.83[a1];[2:a]atrim=0:3.3382,asetpts=PTS-STARTPTS,adelay=3150.0|3150.0,apad[a2];[a1][a2]amerge[a]" \
  -map [a] -map v:0 out.mp4

该命令是用代码生成的,因此其中可能有一些多余的东西。

答案1

成功了。这是工作命令。它包括一个视频、一个完整的背景音轨(1.mp3)和一个音频叠加(2.mp4)。叠加为 3.3 秒,从视频开始的 3.15 秒开始:

# Note: -f concat isn't necessary here. I'm generating the video with threads so I actually pass in a list of videos.
ffmpeg -y -f concat -i video.mp4 -i 1.mp3 -i 2.mp4 \
  -filter_complex \
  "[1:a]atrim=0:11.83,apad=whole_dur=11.83[a1];[2:a]atrim=0:3.3382,asetpts=PTS-STARTPTS,adelay=3150.0|3150.0,apad[a2];[a1][a2]amerge[a]" \
  -map [a] -map v:0 out.mp4

该命令是用代码生成的,因此其中可能有一些多余的东西。

相关内容