我对我认为应该是一个简单的 FFMPEG 脚本有些困惑。我只是想把给定目录中的所有 jpg 文件都放到延时视频中。我对 ffmpeg 中的所有编码器选项和那些东西都很熟悉,但我似乎无法正确理解语法。
我尝试的行应该(是的,我知道......“应该”)只获取目录中的所有 .JPG 图像,并将它们编码为“out.mp4”。但如果你看看底部,我得到的是覆盖 GOPR3974.JPG 的提示——这是目录中的第二个文件。这意味着由于某种原因,它没有正确地将所有文件合并在一起......我试过单引号、双引号,我试过
ffmpeg -i GOPR%04d.JPG out.mp4
所以一定有某个地方有什么东西可以工作。如果重要的话,这是在 cygwin 环境中使用 bash 运行的……
[lwobker:/dtop/hack]$ /usr/local/bin/ffmpeg.exe -i GOPR*.JPG out.mp4
ffmpeg version N-64919-ga613257 Copyright (c) 2000-2014 the FFmpeg developers
built on Jul 23 2014 00:35:22 with gcc 4.8.3 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads
--enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r
--enable-gnutls --enable-iconv --enable-libass --enable-libbluray
--enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme
--enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame
--enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg
--enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr
--enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab
--enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis
--enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264
--enable-libx265 --enable-libxavs --enable-libxvid --enable-decklink
--enable-zlib
libavutil 52. 92.101 / 52. 92.101
libavcodec 55. 69.100 / 55. 69.100
libavformat 55. 48.101 / 55. 48.101
libavdevice 55. 13.102 / 55. 13.102
libavfilter 4. 11.102 / 4. 11.102
libswscale 2. 6.100 / 2. 6.100
libswresample 0. 19.100 / 0. 19.100
libpostproc 52. 3.100 / 52. 3.100
Input #0, image2, from 'GOPR3973.JPG':
Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg), 1920x1440 [SAR 72:72 DAR
4:3], 25 tbr, 25 tbn, 25 tbc
File 'GOPR3974.JPG' already exists. Overwrite ? [y/N]
答案1
方法 1:使用序列模式
如果你的第一张图片名为GOPR0001.JPG
:那么你真正需要的是这个:
ffmpeg.exe -i "GOPR%04d.JPG" -pix_fmt yuv420p out.mp4
或者如果第一个图像被称为GOPR3973.JPG
,则需要给 ffmpeg 提供要查找的起始编号:
ffmpeg.exe -start_number 3973 -i "GOPR%04d.JPG" -pix_fmt yuv420p out.mp4
方法 2:使用通配符模式
如果您的 ffmpeg 版本支持通配符(我认为 Windows 版本不支持),那么您可以简单地执行以下操作:
ffmpeg.exe -pattern_type glob -i "GOPR*.JPG" -pix_fmt yuv420p out.mp4
如果您不知道起始号码或者根本不关心精确控制,则这是首选。
为什么它不起作用
ffmpeg.exe -i GOPR*.JPG out.mp4
这不起作用,因为它会扩展为类似这样的内容(假设您的第一幅图像名为GOPR0001.JPG
):
ffmpeg.exe -i GOPR0001.JPG GOPR0002.JPG … out.mp4
由于 ffmpeg 将最后一个未命名的参数选项(即,没有前导的任何内容-
)视为输出文件名,GOPR2.JPG
因此将是输出,并且直到该值为止的任何内容out.mp4
都不会被应用。
一些提示
-pix_fmt yuv420p
需要将 JPEG 的 YUV 4:2:2 色彩空间转换为 4:2:0 子采样。否则,一些(大多数非基于 FFmpeg 的)播放器将无法显示视频通过设置选项来控制质量
-crf 23
,选择 18 到 28 之间的值,值越低表示质量越好。您可能需要设置捕获输入帧(图像)的帧速率。通过运行 来执行此操作
ffmpeg.exe -framerate 30 -start_number …
。如果您不指定帧速率,ffmpeg 将假定您的原始帧以 25 Hz 录制。阅读
image2
解复用器手册的一部分。使用双引号总是好的,以防止 shell 扩展模式。