以图像文件作为输入的 ffmpeg 输入选项说明

以图像文件作为输入的 ffmpeg 输入选项说明

我有一些图像,我想用 ffmpeg 制作动画 gif。图像名称如下:

837_1.png
838_1.png
...

我试图理解-我ffmpeg 的命令行选项,但是我遇到了一些问题。

如果我没有指定任何内容,它会要求我替换文件:

ffmpeg -i * -vcodec libx264 out.mp4

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 26 2013 20:18:03 with Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, image2, from '358_1.png':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 550x550, 25 tbr, 25 tbn, 25 tbc
File '359_1.png' already exists. Overwrite ? [y/N]

如果我尝试使用互联网上最常用的格式之一 (%d),ffmpeg 找不到以下文件:

fmpeg -i '%3d_1.png' -vcodec libx264 out.mp4

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 26 2013 20:18:03 with Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[image2 @ 0x7f963a006600] Could find no file with with path '%3d_1.png' and index in the range 0-4
%3d_1.png: No such file or directory

那么,问题是,如何使用-我带有 ffmpg 的命令行选项?

为了清楚起见,我使用的是 Mac OSX 10.8、ffmpeg 版本 1.2.1、zsh 4.3.11

答案1

如果没有任何其他选项,ffmpeg 的image2解复用器将查找以 0 开头的序列。它还将检查此索引,默认范围为 5(这就是为什么它会抱怨 0-4 范围内没有索引的原因)。每文档,如果您想从任意索引开始,则必须设置起始号码,例如 837。

ffmpeg -start_number 837 -i '%3d_1.png' -c:v libx264 out.mp4

PNG 到 H.264 转换中的色彩空间

由于 PNG 文件使用 RGB 颜色空间来表示像素,因此转换为 H.264 最终将为 YUV 4:4:4(非子采样)。生成的视频可能无法在所有播放器上播放,尤其是任何非基于 FFmpeg 的播放器。您的播放器将只显示黑帧,或可能崩溃。要解决此问题,请将像素格式更改为 YUV 4:2:0:

ffmpeg -start_number 837 -i '%3d_1.png' -c:v libx264 -pix_fmt yuv420p out.mp4

为了控制质量,请使用该-crf选项。请参阅x264 编码指南了解更多信息。

为什么*glob 不起作用

不要使用*作为输入选项。shell 会在看到它之前将其扩展为当前目录中的所有文件ffmpeg,因此命令将扩展为ffmpeg -i file1 file2 … filen。由于 中的所有输入文件都ffmpeg需要该-i选项,因此它将file2 … filen改为将其作为输出文件并覆盖它们。不好。

答案2

可以通过指定来启用通配符-pattern_type glob选项:

ffmpeg -pattern_type glob -i '*.png' -vcodec libx264 out.mp4

答案3

注意:模式通配在 Windows 下不起作用(并且可能永远不起作用,因为 Windows 下的 libavfilter 缺乏对通配的支持。)所以,如果您在 Windows 下执行此操作,则必须重命名文件,以便它们按顺序编号且没有间隙。

您可以使用简单的 Powershell 命令行重命名它们:

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName “Base$x”; $x++ }

答案4

使用 PowerShell 重命名的更好方法(保留顺序):

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName "Base$($x.tostring('000000')).jpg"; $x++ }

相关内容