在ffmpeg中用淡入/淡出效果创建5张图像的视频


27

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


4
您尝试了什么,然后我们可以为您提供帮助?该论坛不是“请您不做任何工作就给我答案”类型的论坛。话虽如此,我将为您提供ffmpeg淡入淡出文档的链接-ffmpeg.org/ffmpeg-filters.html#fade
Mike Diglio 2014年

Answers:


49

浸入/淡入黑色

向下滚动以使用淡入淡出方法。

淡入淡出的例子

每个图像显示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

有声

与上述相同,但带有音频:

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

适用于变化或任意大小的输入图像

与第一个示例类似,但是输入图像的宽度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

如果要裁剪(填充屏幕)而不是填充板(letterbox / pillarbox),或者要防止放大,请参阅“ 调整视频大小以适合静态大小的播放器”中的示例。

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

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

使用的选项和过滤器:

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

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

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

  • 填充垫缩放,以使输入图像适合特定的均匀大小(用于示例#3)。

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

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

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

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

  • palettegenpaletteuse用于制作漂亮的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

有声

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

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

从每个输入中选择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

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

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


1
@LordNeckbeard,感谢您的回答,我将其用作另一个示例。难道我深知这个数字以下-t-loop 1 -t 1 -i 001.png单个帧的持续时间定义,并遵循数字T/filter_complex块定义过渡的时间?在此示例中,帧持续时间是否包括过渡的持续时间?
cincplug '16

1
@Nisarg这似乎不是完整的输出,我不确定它是您先前显示的两个命令中的哪个命令。无论如何,请尝试添加-preset ultrafast
llogan

1
@LordNeckbeard我需要将一组图像,视频剪辑和音轨组合在一起以创建单个视频文件(最好是ogg,但这一点无关紧要)。另外,我需要在相邻图像之间创建一些过渡效果。有什么方法可以使用ffmpeg和/或其他命令行工具来编写整个任务的脚本?目标是通过命令行界面自动执行任务。
网络用户

1
@WebUser Transitions可能会更容易使用melt
llogan

2
ffmpeg方法对我来说效果很好;谢谢!给该页面新手的提示;在concat=n=9命令部分,9来自示例中的5张图像+图像之间的4个过渡。如果要处理其他数量的图像,则需要相应地进行调整。
Jim Miller

4

我写了一个通用的bash脚本,它包含一个指向图像文件夹的路径,并输出带有ffmpeg的淡入淡出视频:

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

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


抱歉,您的脚本在ffmpeg 3.0.1中失败,输入#0至#4,它返回:“过滤器描述中的文件索引5无效”
Krzysztof Bociurko

TobySpeight:好的,我对答案进行了更清晰的编辑。基本上,上面的@LordNeckbeard已经给出了主要思想。该脚本只概括了许多图像。
anh_ng8 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.