使用 ffmpeg 将图像转换为视频

Posted

技术标签:

【中文标题】使用 ffmpeg 将图像转换为视频【英文标题】:Turning images into videos with ffmpeg 【发布时间】:2014-03-02 09:58:33 【问题描述】:

我在另一个论坛上问过这个问题,但从来没有运气。我在网上找到了以下命令,该命令应该使用 FFmpeg 从图像(每个持续时间为 5 秒)创建视频。

ffmpeg -f image2 -r 1/5 -i img%03d.png -vcodec libx264 out.mp4

我已经运行了它,并且我有两个名为 img001.png 和 img002.png 的图像,但是当我播放 out.mp4 时,它只有 5 秒的剪辑,并且正在播放 img001.png。真正奇怪的是,在我的 Windows Media Player 中,它认为它有 10 秒长(2 张图像 @ 10 秒),但是当仪表到达视频的一半(5 秒)时,它就结束了。

对可能发生的事情有什么建议吗?

我还尝试了一些我在网上找到的其他命令,但都没有成功。他们最终会显示两张图片,但第一张只会闪烁几分之一秒,或者其他一些人会在视频结束时对第二张图片做同样的事情。

我已将 ImageMagick 安装到我的 Windows Vista PC 上的 XAMPP 中。如果需要,我可以提供命令的命令行输出。

编辑:添加命令行输出

C:\xampp\htdocs>ffmpeg -f image2 -r 1/5 -i img%03d.png -vcodec libx264 out.mp4
ffmpeg version N-50911-g9efcfbe Copyright (c) 2000-2013 the FFmpeg developers
  built on Mar 13 2013 21:26:48 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libg
sm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libo
pencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-li
bschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-lib
twolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enabl
e-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 19.100 / 52. 19.100
  libavcodec     55.  0.100 / 55.  0.100
  libavformat    55.  0.100 / 55.  0.100
  libavdevice    54.  4.100 / 54.  4.100
  libavfilter     3. 45.103 /  3. 45.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 'img%03d.png':
  Duration: 00:00:10.00, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 800x600 [SAR 1:1 DAR 4:3], 0.20 tbr, 0.20 tb
n, 0.20 tbc
[libx264 @ 0032cae0] using SAR=1/1
[libx264 @ 0032cae0] using cpu capabilities: MMX2 SSE2Slow SlowCTZ
[libx264 @ 0032cae0] profile High 4:4:4 Predictive, level 3.1, 4:4:4 8-bit
[libx264 @ 0032cae0] 264 - core 130 r2274 c832fe9 - H.264/MPEG-4 AVC codec - Cop
yright 2003-2013 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 de
block=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1
me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chr
oma_qp_offset=4 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i
nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=1 scenecu
t=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0
 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'out.mp4':
  Metadata:
    encoder         : Lavf55.0.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv444p, 800x600 [SAR 1:1
 DAR 4:3], q=-1--1, 16384 tbn, 0.20 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (png -> libx264)
Press [q] to stop, [?] for help
frame=    2 fps=0.0 q=2621023.0 Lsize=      37kB time=00:00:10.00 bitrate=  30.0
kbits/s
video:36kB audio:0kB subtitle:0 global headers:0kB muxing overhead 2.142993%
[libx264 @ 0032cae0] frame I:1     Avg QP:11.18  size: 17627
[libx264 @ 0032cae0] frame P:1     Avg QP:11.45  size: 18415
[libx264 @ 0032cae0] mb I  I16..4: 18.3% 69.5% 12.3%
[libx264 @ 0032cae0] mb P  I16..4: 11.6% 60.1%  9.7%  P16..4:  8.9%  6.6%  2.2%
 0.0%  0.0%    skip: 0.8%
[libx264 @ 0032cae0] 8x8 transform intra:71.4% inter:67.1%
[libx264 @ 0032cae0] coded y,u,v intra: 57.0% 24.1% 22.3% inter: 42.6% 25.7% 16.
4%
[libx264 @ 0032cae0] i16 v,h,dc,p: 28% 50% 15%  8%
[libx264 @ 0032cae0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 16% 39% 28%  2%  2%  2%  3%
 3%  4%
[libx264 @ 0032cae0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 14% 53% 23%  1%  2%  2%  3%
 0%  2%
[libx264 @ 0032cae0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0032cae0] kb/s:28.83

C:\xampp\htdocs>

【问题讨论】:

@LordNeckbeard 如果您在 ffmpeg 控制台输出中所指的内容,我已经添加了命令行输出。另外,我确实计划将它与 php 和 exec() 一起使用。但是我从来不知道FFMpeg不能在这个网站上使用?看起来有很多其他人在使用它。 参见,例如***.com/questions/7468274/… @fredrilPhil 我试过了,但它说“帧大小无效:WxH”。当我删除大小时,它只会创建一个快速显示两帧的 0 秒视频。知道如何为每张图片添加长度吗?我将 -r 1/5 添加到您链接到的相同语法的开头,它仅在 5 秒时播放第一张图像,并在最后闪烁第二张图像。 您是否真的将“W”和“H”替换为“1920”和“1080”等全高清值? frame= 2 似乎怀疑文件都排好了吗? 【参考方案1】:

我认为你唯一的问题是你没有告诉 ffmpeg 使用什么输出格式。

试试ffmpeg -f image2 -r 1/5 -i img%03d.png -vcodec libx264 -pix_fmt yuv420p out.mp4

还请记住,图像必须具有相同的大小。如果不是,您需要将它们预处理为相同的大小。

祝你好运

【讨论】:

以上是关于使用 ffmpeg 将图像转换为视频的主要内容,如果未能解决你的问题,请参考以下文章

将屏幕截图捕获为图像然后使用 ffmpeg 将图像转换为视频文件的时间应该是啥?

使用 ffmpeg 和文件列表将图像序列转换为视频

ffmpeg 在将图像转换为视频时改变配色方案

使用 FFMPEG 将所有视频帧提取为图像

使用 MediaCodec 和 MediaMuxer 将图像转换为视频

将图像序列转换为视频