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

时间:2014-02-06 07:51:21

标签: ffmpeg

目前我正在尝试为每张图片制作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列出以下内容 档案'000.mp4' 档案'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>

1 个答案:

答案 0 :(得分:9)

您的控制台输出显示您正在编写4:4:4 H.264输出,这是很少有玩家支持的。 (较新版本的FFmpeg警告说。)在输出文件前添加-pix_fmt yuv420p以转换为广泛支持的4:2:0像素格式。您还可以添加-profile:v baseline以使其适用于更多玩家。 (这些选项适用于编码,因此不要在指定-codec copy的命令上使用它们。)您也可以尝试使用ffplay播放输出文件,ffmpeg -framerate 0.2 -i %3d.jpg -vf fps=10 -pix_fmt yuv420p output.mp4 是支持4的少数播放器之一:mp4文件中的4:4 H.264。

如果您希望每个图像的持续时间相同且连续编号,则只需要一个命令,例如:

-framerate 0.2

%3d将输入帧速率设置为每秒0.2帧(每5秒1帧)。对于每个帧,000被3位001-vf fps=10等替换。 concat将帧速率更改为每秒10帧,在这种情况下,通过复制输入帧;它不是严格必要的,但可以有助于低帧速率,使搜索更平滑,并确保第一个和最后一个图像的完整持续时间,并且不应该增加输出大小,因为可以编码与前一帧相同的帧小规模。

如果您想继续使用inputs.txt多路分离器,或者想要为每张图片设置不同的文件名或持续时间,您可以直接指定图像,并为file 000.jpg duration 5 file 001.jpg duration 5 ... 中的每个图像添加一段时间。无需为每个图像创建单独的电影文件。例如:

ffmpeg -f concat -i inputs.txt -vf fps=10 -pix_fmt yuv420p output.mp4

然后使用concat demuxer连接它们并同时执行编码:

{{1}}

如果其中任何一项不起作用,请将您的FFmpeg升级到最新版本。