(编辑:请参阅下面的修复版本)
我正在开发一款用于制作视频和动画的应用。用户可以添加文本和视频元素。我已经开发了一个渲染器,它可以生成帧并使用 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
该命令是用代码生成的,因此其中可能有一些多余的东西。