在 ffmpeg 中创建带有淡入/淡出效果的 5 个图像的视频

use*_*847 42 video ffmpeg images

对于 5 张图像,我必须在 ffmpeg 中创建 60 秒的视频,每张图像必须显示 15 秒。15 秒后,第一个图像必须淡出,第二个图像必须淡入,在第二个图像必须淡出之后,第三个图像必须淡入......等等。请指导我如何使用 ffmpeg 命令实现此目的。

llo*_*gan 77

浸入/淡入黑色

向下滚动交叉淡入淡出方法。

淡入淡出的例子

每个图像显示 5 秒并且每个图像都有持续 1 秒的淡入淡出的示例。每个图像输入具有相同的宽度、高度和样本纵横比。如果它们的大小不同,请参见下面的示例 #3。

MP4 输出

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4
Run Code Online (Sandbox Code Playgroud)

带音频

与上面相同,但有音频:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-i audio.m4a \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 5:a -shortest out.mp4
Run Code Online (Sandbox Code Playgroud)

对于具有不同或任意大小的输入图像

像第一个例子一样,但输入图像的宽度 x 高度不同。它们将被填充以适应 1280x720 的盒子:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v0]; \
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4
Run Code Online (Sandbox Code Playgroud)

如果您想裁剪(填充屏幕)而不是填充(信箱/邮筒),或者如果您想防止放大,请参阅调整视频大小以适应静态大小的播放器中的示例。

GIF 输出

添加了如何使用 ffmpeg 将视频转换为 GIF的过滤器,质量合理?

ffmpeg \
-framerate 10 -loop 1 -t 5 -i input0.png \
-framerate 10 -loop 1 -t 5 -i input1.png \
-framerate 10 -loop 1 -t 5 -i input2.png \
-framerate 10 -loop 1 -t 5 -i input3.png \
-framerate 10 -loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif
Run Code Online (Sandbox Code Playgroud)

使用-loop输出选项来控制 GIF 循环的次数。如果不使用此选项,则默认为无限循环。的值-1是没有循环的。

使用的选项和过滤器:

  • -t 以秒为单位设置每个输入的持续时间。

  • -loop 1 循环图像,否则它的持续时间为 1 帧。

  • -framerate设置输入图像帧率(未声明时的默认值为 25)。用于制作 GIF。

  • 使用pad缩放以将输入图像适合特定的、统一的大小(在示例 #3 中使用)。

  • 淡入淡出。d是淡入淡出的持续时间。st是什么时候开始。

  • concat连接(或“连接”)每个图像。

  • 如果输出 MP4 并使用 libx264 编码(如果您的构建支持 MP4 输出的默认编码器),则输出与基于非 FFmpeg 的播放器兼容的色度子采样方案的格式

  • 拆分以制作过滤器输出的副本。调色板*过滤器需要在一个命令中完成所有操作。

  • 调色板调色板用于制作漂亮的 GIF。


淡入淡出

淡入淡出示例

每个图像显示 5 秒并且每个图像都有持续 1 秒的交叉淡入淡出的示例。每个图像输入具有相同的宽度、高度和样本纵横比。如果它们的大小不同,则采用上面的示例 #3。

MP4 输出

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -movflags +faststart out.mp4
Run Code Online (Sandbox Code Playgroud)

带音频

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-i music.mp3 \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -map 5:a -shortest -movflags +faststart out.mp4
Run Code Online (Sandbox Code Playgroud)

两个带音频的视频之间的淡入淡出

从每个输入中选择 5 秒段并添加 1 秒交叉淡入淡出:

ffmpeg -i input0.mp4 -i input1.mp4 -filter_complex \
"[0:v]trim=start=5:end=10,setpts=PTS-STARTPTS[v0];
 [1:v]trim=start=12:end=17,setpts=PTS-STARTPTS+4/TB,format=yuva444p,fade=st=4:d=1:t=in:alpha=1[v1];
 [v0][v1]overlay,format=yuv420p[v];
 [0:a]atrim=start=5:end=10,asetpts=PTS-STARTPTS[a0];
 [1:a]atrim=start=12:end=17,asetpts=PTS-STARTPTS[a1];
 [a0][a1]acrossfade=d=1[a]" \
-map "[v]" -map "[a]" output.mp4
Run Code Online (Sandbox Code Playgroud)

GIF 输出

ffmpeg \
-framerate 10 -loop 1 -t 5 -i 1.png \
-framerate 10 -loop 1 -t 5 -i 2.png \
-framerate 10 -loop 1 -t 5 -i 3.png \
-framerate 10 -loop 1 -t 5 -i 4.png \
-framerate 10 -loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3];[bg3][f3]overlay,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif
Run Code Online (Sandbox Code Playgroud)

使用-loop输出选项来控制 GIF 循环的次数。如果不使用此选项,则默认为无限循环。的值-1是没有循环的。

  • ffmpeg 方法对我来说效果很好;谢谢!给页面新人的一个提示;在命令的 `concat=n=9` 部分,`9` 来自示例中的 5 个图像 + 图像之间的 4 个转换。如果您要处理不同数量的图像,则需要相应地进行调整。 (2认同)

anh*_*ng8 7

我写了一个通用的 bash 脚本,它接收一个图像文件夹的路径,并用 ffmpeg 输出一个淡入淡出的视频:

https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e

该脚本本质上是查看文件夹中的图像并打印出与上面@LordNeckbeard 的答案类似的命令,然后执行该命令。当您在一个文件夹中有许多图像并且不想手动输入令人沮丧的长命令时,此脚本会有所帮助。