如何从一系列图像文件创建动画 GIF?

如何从一系列图像文件创建动画 GIF?

我尝试了这个命令行:

D:\Captured>ffmpeg -framerate 1/2 -start_number 1 -i "D:/New folder (76)/Image%d.png" -loop -1 D:/test.gif

但出现此错误:

[image2 @ 00000000026324a0] Could find no file with path 'D:/New folder (76)/Image%d.png' and index in the range 1-5 D:/New folder (76)/Image%d.png: No such file or directory

这是包含图像的文件夹的屏幕截图,我只想获取以名称 image 开头的 png 类型的图像:

硬盘上的图像


更新:这是我创建动画 GIF 后收到的消息,包括来自的命令行这个答案

D:\Captured>ffmpeg -framerate 1/2 -start_number 1 -i "D:/New folder (76)/Image_%04d.png" -loop -1 D:/test.gif
ffmpeg version n6.1.1-20240114 Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 13.2.0 (crosstool-NG 1.25.0.232_c175b21)
  configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libharfbuzz --enable-libvorbis --enable-opencl --disable-libpulse --enable-libvmaf --disable-libxcb --disable-xlib --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --enable-libvpl --enable-openal --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --enable-vaapi --enable-libvidstab --enable-vulkan --enable-libshaderc --enable-libplacebo --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --disable-doc --disable-ffplay --disable-ffprobe --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags= --extra-libs=-lgomp --extra-version=20240114
  libavutil      58. 29.100 / 58. 29.100
  libavcodec     60. 31.102 / 60. 31.102
  libavformat    60. 16.100 / 60. 16.100
  libavdevice    60.  3.100 / 60.  3.100
  libavfilter     9. 12.100 /  9. 12.100
  libswscale      7.  5.100 /  7.  5.100
  libswresample   4. 12.100 /  4. 12.100
  libpostproc    57.  3.100 / 57.  3.100
Input #0, image2, from 'D:/New folder (76)/Image_%04d.png':
  Duration: 00:00:02.00, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: png, rgba(pc, gbr/unknown/unknown), 1536x2048, 0.50 fps, 0.50 tbr, 0.50 tbn
Stream mapping:
  Stream #0:0 -> #0:0 (png (native) -> gif (native))
Press [q] to stop, [?] for help
Output #0, gif, to 'D:/test.gif':
  Metadata:
    encoder         : Lavf60.16.100
  Stream #0:0: Video: gif, bgr8(pc, gbr/unknown/unknown, progressive), 1536x2048, q=2-31, 200 kb/s, 0.50 fps, 100 tbn
    Metadata:
      encoder         : Lavc60.31.102 gif
[out#0/gif @ 0000016edfc34bc0] video:696kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000140%
frame=    1 fps=0.0 q=-0.0 Lsize=     696kB time=00:00:00.00 bitrate=N/A speed=   0x
 
D:\Captured>

答案1

%04d由于您的文件名中有以零开头的数字,因此您应该使用而不是 的形式%d。 (此外, 之前缺少一个下划线%d)。

来自文档

序列模式可能包含字符串“%d”或“%0Nd”,用于指定与模式匹配的每个文件名中表示序列号的字符的位置。如果使用“%d0Nd”格式,则每个文件名中表示数字的字符串都是用 0 填充的,N 是代表数字的用 0 填充的位数的总数。

如果仅使用%d,ffmpeg 会尝试查找不存在的文件,例如、等Image1.pngImage2.png

你的完整命令将是:

D:\Captured>ffmpeg -framerate 1/2 -start_number 1 -i "D:/New folder (76)/Image_%04d.png" -loop -1 D:/test.gif

最后,我假设您的文件确实是.png,但由于扩展名未显示,因此屏幕截图中看不到它。如果不是,您也必须更正该部分。


更新:在您发表评论后,您自己发现文件编号也不是连续的。处理此问题的正确方法是使用-pattern_type glob,因此在您的情况下,这将是:

D:\Captured>ffmpeg -framerate 1/2 -start_number 1 -pattern_type glob -i "D:/New folder (76)/Image_????.png" -loop -1 D:/test.gif

也可以看看这个答案

相关内容