我在 Android 应用程序中使用 ffmpeg。我想从带有背景视频和音频的图像创建视频。图像以边框形式叠加在视频上。视频和音频将重复播放,直到所有幻灯片都看不到为止。
这个视频显示了我想要实现的一个例子。
我需要什么命令?我不知道如何编写 ffmpeg 命令。
在我的应用程序中,用户可以从图库中选择图像。使用选定的图像,我必须创建一个视频,每个图像将显示 5 秒。我有一个持续时间很短的视频和音频(如链接视频中所示,例如火灾视频),它们将重复播放,直到显示完所有幻灯片。
答案1
这是可能的,但由于选定图像的数量可变并且缺少视频和音频输入的真正循环选项,因此需要额外的脚本。
这个答案提供了一些例子,但您还有循环播放视频和音频流的额外要求。
以下是您可以改编和构建的示例。脚本由您决定。
示例 1
此示例假设:
所有图像输入都是相同的帧大小。这是一项要求,否则可能会出现时间问题。
所有图像输入都命名为
img001.jpg
、img002.jpg
、img003.jpg
等。或者,您可以使用 glob 模式,如中所述图像文件解复用器文档。
ffmpeg -i video.mkv -i audio.mp3 -framerate 1/5 -i img%03.jpg -filter_complex \
"[0:v]setpts=PTS-STARTPTS[vid]; \
[vid][vid][vid]concat=n=3:v=1:a=0[bg]; \
[1:a][1:a][1:a]concat=n=3:v=0:a=1[a]; \
[2:v]drawbox=t=5:c=white[fg]; \
[bg][fg]overlay=(W-w)/2:(H-h)/2,format=yuv420p[v]" \
-map "[v]" -map "[a]" -shortest output.mp4
示例 2
另一种方法是将每幅图像明确列为单独的输入。这可以让你根据需要执行任何缩放,但会使命令更加复杂:
ffmpeg -i video.mkv -i audio.mp3 -loop 1 -i hound.jpg -loop 1 -i crow.jpg \
-loop 1 -i donkey.png -filter_complex \
"[0:v]setpts=PTS-STARTPTS[vid]; \
[vid][vid][vid]concat=n=3:v=1:a=0[bg]; \
[1:a][1:a][1:a]concat=n=3:v=0:a=1[a]; \
[2:v]trim=duration=5,scale=640:360,drawbox=t=5:c=white[fg0]; \
[3:v]trim=duration=5,scale=640:360,drawbox=t=5:c=white[fg1]; \
[4:v]trim=duration=5,scale=640:360,drawbox=t=5:c=white[fg2]; \
[bg][fg0]overlay=(W-w)/2:(H-h)/2[ol0]; \
[ol0][fg1]overlay=(W-w)/2:(H-h)/2[ol1]; \
[ol1][fg2]overlay=(W-w)/2:(H-h)/2,format=yuv420p[v]" \
-map "[v]" -map "[a]" -shortest output.mp4
Super User 上有几个答案提供了更复杂的缩放示例。此示例很简单,但如果输入图像的纵横比不同,则可能会导致输出图像被挤压或拉伸。
您需要确定什么
对于这两种方法,根据用户选择的图像数量以及视频和音频的持续时间,你必须确定需要多少个片段concat
过滤器提供适当的循环。
您可能会遇到一些问题。图像解复用器concat
有时会出现问题。