linux - 在图像之间应用淡入淡出 ffmpeg 命令

标签 linux ffmpeg

我正在尝试创建一个视频幻灯片,它仅通过 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.

我想要做的就是创建一个带有淡入淡出/图像之间过渡的视频幻灯片。非常感谢任何帮助!

最佳答案

我找到了这个问题的最佳答案,因为似乎不可能用一个命令来完成。首先,您为每个图像创建一个 mpeg,使用视频过滤器 (-vf) 将淡入淡出应用于 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”。一旦创建了这些中间 mpeg,您就可以将它们很好地连接成一个视频:

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

在此连接命令的“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

关于linux - 在图像之间应用淡入淡出 ffmpeg 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33261340/

相关文章:

java - Linux 使用来自 jar 文件的方法(Java 代码)

ajax - 网页无法在 Linux 上运行

python - 使用不同的工具(librosa、ffprobe)相同的音频有不同的长度

ffmpeg - 将 59.94fps 视频转换为 29.97 的最佳方法?

ffmpeg - 重新复用为 MKV 但使用 FFmpeg 添加所有流

node.js - NodeJS : Process has been killed unexpectedly

c - I2C IOCTL 写入失败

linux - opengl与Nvidia gpu

ffmpeg - 根据流量分段记录 RTP 流

ffmpeg - 使用 Gstreamer 将 Raspberry Pi USB 网络摄像头流传输到计算机