我有一些图像,我想用 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++ }