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

标签 ffmpeg

目前,我正在尝试为每个图像制作 5 秒的视频,然后使用 concat 将它们组合起来,但这样做遇到了很多问题。

这是我的代码:

ffmpeg -loop 1 -i 000.jpg -t 5 000.mp4 ffmpeg -循环1 -i 001.jpg -t 5 001.mp4 ffmpeg -f concat -i 输入.txt -编解码器复制输出.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>

最佳答案

您的控制台输出显示您正在编写 4:4:4 H.264 输出,很少有播放器支持。 (较新版本的 FFmpeg 会对此发出警告。)在输出文件之前添加 -pix_fmt yuv420p 以转换为广泛支持的 4:2:0 像素格式。您还可以添加 -profile:v benchmark 以使其适用于更多玩家。 (这些选项适用于编码,因此不要在指定 -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 被替换为 3 位数字 000001 等。 -vf fps=10 将帧速率更改为每秒 10 帧,在本例中是通过复制输入帧来实现的;这不是绝对必要的,但对于低帧速率很有帮助,可以使搜索更平滑并确保第一个和最后一个图像的完整持续时间,并且不应该增加输出大小太多,因为可以对与前一帧相同的帧进行编码小尺寸。

如果您想继续使用concat 分路器,或者希望每个图像具有不同的文件名或持续时间,您可以在输入中直接指定图像以及每个图像的持续时间。 txt.无需为每个图像创建单独的电影文件。例如:

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

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

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

如果这些方法中的任何一个不起作用,请将您的 FFmpeg 升级到最新版本。

关于ffmpeg - 如何成功使用ffmpeg将图像转换为视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21596984/

相关文章:

FFMPEG:MP4 视频无法在 iPhone、iPod、iPad 中正常播放

vb6 - 比特率计算

c - 获取显示矩阵并使用 ffmpeg C API 更改它

ffmpeg - 如何计算在 iPhone 上显示视频的最佳尺寸和比特率?

nginx - 如何 : stream with ffmpeg and nginx rtmp, Ubuntu

ffmpeg - 在 FFMpeg Ubuntu “rtmp://url live=1” 中不起作用

video - FFMpeg 将 .srt 文件作为 WebVTT 嵌入到 hls 流播放列表中

c++ - 想要 ffmpeg 编码示例吗?

c++ - 如何将视频级别分配给ffmpeg中的结构AVCodecContext?

nginx - FFmpeg -> JSMpeg Websocket 反复关闭