我正在尝试创建一个视频幻灯片,仅在ffmpeg cli命令中淡出/淡出每个图像。经过几个小时的研究,我发现这是可能的唯一方法是使用-filter_complex
参数并传入所有图像并指定一个复杂的过滤器,定义多个淡入淡出和返回,我可以在两者之间发生帧。我到目前为止的命令:
ffmpeg -y -framerate 1/5 \
-loop 1 -i img-1.jpg \
-loop 1 -i img-2.jpg \
-loop 1 -i img-3.jpg \
-filter_complex \
"[1:v]fade=out:4:d=1,fade=in:5:d=1[fad1]; \
[2:v]fade=out:9:d=1,fade=in:10:d=1[fad2]; \
[3:v]fade=out:14:d=1,fade=in:15:d=1[fad3];" \
-c:v libx264 -r 25 -pix_fmt yuv420p test.mp4
这是执行此命令的输出:
ffmpeg version 2.6.4 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 5.1.1 (GCC) 20150618 (Red Hat 5.1.1-4)
configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' --enable-bzlib --disable-crystalhd --enable-frei0r --enable-gnutls --enable-ladspa --enable-libass --enable-libcdio --enable-libdc1394 --disable-indev=jack --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-openal --enable-libopencv --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-x11grab --enable-avfilter --enable-avresample --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-runtime-cpudetect
libavutil 54. 20.100 / 54. 20.100
libavcodec 56. 26.100 / 56. 26.100
libavformat 56. 25.101 / 56. 25.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 11.102 / 5. 11.102
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, image2, from img-1.jpg':
Duration: 00:00:05.00, start: 0.000000, bitrate: 141 kb/s
Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 1280x720 [SAR 72:72 DAR 16:9], 0.20 fps, 0.20 tbr, 0.20 tbn, 0.20 tbc
Input #1, image2, from img-2.jpg':
Duration: 00:00:00.04, start: 0.000000, bitrate: 17789 kb/s
Stream #1:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 1280x720 [SAR 67:67 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
Input #2, image2, from 'img-3.jpg':
Duration: 00:00:00.04, start: 0.000000, bitrate: 17764 kb/s
Stream #2:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 1280x720 [SAR 62:62 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
[AVFilterGraph @ 0xbc2a00] No such filter: ''
Error configuring filters.
我要做的就是创建一个视频幻灯片,图像之间有淡入/过渡。非常感谢任何帮助!
答案 0 :(得分:0)
我找到了最好的答案,因为在一个命令中似乎无法实现这一点。首先,使用视频过滤器(-vf)创建每个图像的mpeg,将淡入淡出应用于mpeg:
ffmpeg -y -loop 1 -i image-1.jpg -vf “fade = t = in:st = 0:d = 0.5,fade = t = out:st = 4.5:d = 0.5”-c:v mpeg2video -t 5 -q:v 1 -pix_fmt yuv420p temp-1.mpeg
如果你想在一个命令中执行此操作,它不是最漂亮的解决方案,但你可以将命令连接为“command1&& command2&& ....”,假设上面是'command1'。一旦创建了这些中间mpegs,您就可以很好地将它们连接成一个视频:
ffmpeg -i temp-1.mpeg -i temp-2.mpeg -filter_complex'[0:v] [1:v] concat = n = 2:v = 1 [v]'-map'[v] '-c:v libx264 -r 30 -s 1280x720 -aspect 16:9 -q:v 1 -pix_fmt yuv420p output.mp4
在此concatentation命令的“concat = n = 2”部分中,“2”表示您拥有的输入数量。这将为您提供一个视频幻灯片,其中包含开始时淡入0.5秒和最后0.5秒淡出的图像,这样可以实现图像之间的淡入淡出效果。
此外,在将图像转换为中间mpeg时,可以通过将“zoompan”视频滤镜添加到第一个命令来为每个图像添加平移/缩放。例如,您的第一个命令将变为:
ffmpeg -y -loop 1 -i image-1.jpg -vf “zoompan = z ='min(zoom + 0.0015,1.5)':d = 125,fade = t = in:st = 0:d = 0.5,fade = t = out:st = 4.5:d = 0.5”-c :v mpeg2video -t 5 -q:v 1 -pix_fmt yuv420p temp-1.mpeg