如何成功使用ffmpeg将图像转换为视频

7

目前我正在尝试为每个图像制作5秒钟的视频,然后使用concat组合它们,但是在这个过程中我遇到了很多问题。

这是我的代码:

ffmpeg -loop 1 -i 000.jpg -t 5 000.mp4 ffmpeg -loop 1 -i 001.jpg -t 5 001.mp4 ffmpeg -f concat -i inputs.txt -codec copy output.mp4

inputs.txt 列出如下内容: file '000.mp4' file '001.mp4'

现在当我尝试运行所有这些时,输出的mp4文件的第一部分可以正常工作,但是一旦开始显示视频的001部分,它就会切换到灰色屏幕。 单独的001.mp4文件中甚至没有这种情况。

有什么建议或者我能做什么来解决这个问题吗?

我也尝试了很多其他方法。例如将所有文件都转换为png,但是仍然出现了相同的问题。 我还尝试使用不同的输出文件类型,例如wmv、avi等。 但是我还是很新,所以不知道还能尝试什么。

这是在运行命令后出现在命令提示符中的内容。

C:\xampp\htdocs\images>ffmpeg -f concat -i inputs.txt -codec copy output.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
[concat @ 003b9660] Estimating duration from bitrate, this may be inaccurate
Input #0, concat, from 'inputs.txt':
  Duration: 00:00:00.01, start: 0.000000, bitrate: 28 kb/s
    Stream #0:0: Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444
p, 800x600 [SAR 1:1 DAR 4:3], 28 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc
Output #0, mp4, to 'output.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=2-31, 28 kb/s, 25 fps, 12800 tbn, 12800 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
frame=  250 fps=0.0 q=-1.0 Lsize=      31kB time=00:00:09.88 bitrate=  26.1kbits
/s
video:28kB audio:0kB subtitle:0 global headers:0kB muxing overhead 13.534948%

C:\xampp\htdocs\images>

你是否一次拥有所有的图片? - BlueSword
1个回答

14

您的控制台输出显示您正在编写4:4:4 H.264输出,这是很少有播放器支持的。(新版本的FFmpeg会警告此问题。) 在输出文件之前添加-pix_fmt yuv420p以转换为广泛支持的4:2:0像素格式。您还可以附加-profile:v baseline以使其在更多播放器上运行。(这些选项适用于编码,因此不要在指定-codec copy的命令上使用它们。) 您还可以尝试使用ffplay播放输出文件,这是少数几个支持mp4文件中的4:4:4 H.264的播放器之一。

如果您希望每个图像具有相同的持续时间,并且它们是按顺序编号的,则只需要一个命令,例如:

ffmpeg -framerate 0.2 -i %3d.jpg -vf fps=10 -pix_fmt yuv420p output.mp4

-framerate 0.2设置输入帧率为每秒0.2帧(每5秒1帧)。%3d将被替换为三个数字000001等,对于每个帧都有不同的值。-vf fps=10将帧速率更改为每秒10帧,在这种情况下通过复制输入帧来实现;虽然它并非严格必要,但在低帧速率下可以使查找更加平滑,并确保第一个和最后一个图像的完整持续时间,而且应该不会增加输出大小太多,因为与前一帧相同的帧可以用较小的大小编码。

如果您想继续使用concat解复用器,或者需要为每个图像指定不同的文件名或持续时间,则可以在inputs.txt中直接指定每个图像及其持续时间。无需为每个图像创建单独的电影文件。例如:

file 000.jpg
duration 5
file 001.jpg
duration 5
...

然后使用concat多路复用器将它们拼接在一起,并同时进行编码:

ffmpeg -f concat -i inputs.txt -vf fps=10 -pix_fmt yuv420p output.mp4
如果这些东西有任何问题,请升级您的FFmpeg到最新版本。

非常感谢您的出色回答。不幸的是,我仍然有一个问题。我尝试运行“ffmpeg -f concat -i inputs.txt -vf fps=10 -pix_fmt yuv420p output.mp4”,输入文件的结构就像您列出的那样(不包括点)。奇怪的是,输出现在显示了之前变灰的图像。但是现在第一张图片已经不见了。如果它仍然无法正常工作,我将尝试升级到最新版本并与您联系。我以为它已经是最新版本了,但我会再次确认。 - user3276588
仍然没有任何运气:(我卸载了ImageMagick,然后安装了最新的Zeranoe FFmpeg Build版本“git-9c978f2”,但还是无法工作。感到无言以对:(过去48个小时一直在各处搜索,试图解决这个问题。尝试我能找到的一切。我唯一能让它工作的是合并两个视频,但它们是“我的视频”中默认的wmv视频,显示在每台Windows计算机上。从图像创建视频并尝试合并它们不起作用。 - user3276588
1
你只是没有看到第一张图片吗?你尝试在inputs.txt中复制第一张图片了吗? - mark4o
它曾经这样做,但后来我卸载了imagemagick并安装了最新的Zeranoe FFmpeg Build版本。现在它似乎只生成一个0秒的视频,快速闪烁第二张图片。我将尝试多次复制图像,看看是否有任何差异。编辑:哇,实际上你是对的。在inputs.txt文件中复制图像后正在取得一些进展。 :) 我会花一些时间来调整它,看看我能否找到正确的使用次数。 - user3276588
1
你做到了,@mark4o - 通过在inputs.txt文件中复制第一张图像一次,现在成功地播放了两个图像,每个图像都持续5秒钟,没有任何灰屏。我不明白为什么我必须这样做:P但无论如何,感谢您的帮助。否则我会一直卡在这里! - user3276588
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接