ffmpeg 延时“覆盖”错误 - 可能是 globbing/shell 问题?

ffmpeg 延时“覆盖”错误 - 可能是 globbing/shell 问题?

我对我认为应该是一个简单的 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 扩展模式。

相关内容