为什么通过 FFmpeg 从图像创建视频时第一张图像变化如此之快?

为什么通过 FFmpeg 从图像创建视频时第一张图像变化如此之快?
ffmpeg -r 0.15 -qscale 2 -i /var/www/44693/%0d.jpg /var/www/44693/output11.mp4

使用此命令,我可以基于图像创建视频,但第一张图像变化太快。其他图像都很好。

这是创建视频

输出为文本:

root@li465-71:~# ffmpeg -r 0.15 -qscale 2 -i /var/www/44693/%0d.jpg /var/www/446                                                                                        93/output11.mp4
ffmpeg version 0.8.1-4:0.8.1-0ubuntu1, Copyright (c) 2000-2011 the Libav develop                                                                                        ers
  built on Mar 22 2012 05:29:10 with gcc 4.6.3
This program is not developed anymore and is only provided for compatibility. Us                                                                                        e avconv instead (see Changelog for the list of incompatible changes).
[image2 @ 0x85dcaa0] max_analyze_duration reached

Seems stream 0 codec frame rate differs from container frame rate: 0.15 (3/20) -                                                                                        > 0.75 (3/4)
Input #0, image2, from '/var/www/44693/%0d.jpg':
  Duration: 00:01:13.33, start: 0.000000, bitrate: N/A
    Stream #0.0: Video: mjpeg, yuvj420p, 800x600 [PAR 1:1 DAR 4:3], 0.15 fps, 0.                                                                                        75 tbr, 0.15 tbn, 0.15 tbc
File '/var/www/44693/output11.mp4' already exists. Overwrite ? [y/N] y
Incompatible pixel format 'yuvj420p' for codec 'mpeg4', auto-selecting format 'yuv420p'
[buffer @ 0x85df820] w:800 h:600 pixfmt:yuvj420p
[avsink @ 0x85de240] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src'                                                                             and the filter 'out'
[scale @ 0x85de680] w:800 h:600 fmt:yuvj420p -> w:800 h:600 fmt:yuv420p flags:0x4
Output #0, mp4, to '/var/www/44693/output11.mp4':
  Metadata:
    encoder         : Lavf53.21.0
    Stream #0.0: Video: mpeg4, yuv420p, 800x600 [PAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 3 tbn,                                                                             0.75 tbc
Stream mapping:
  Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
frame=   50 fps=  0 q=2.0 Lsize=     949kB time=66.67 bitrate= 116.6kbits/s dup=39 drop=0                                                                               
video:948kB audio:0kB global headers:0kB muxing overhead 0.125724%

答案1

这是一个错误,我自己注意到了。FFmpeg 总是按顺序输出第一幅和第二幅图像,您选择的任何时间都只在第二幅图像之后开始。例如,如果您每十秒输出一帧,并且您正在制作一部 25fps 的电影,则第一幅图像将是您的第一帧,第二幅图像将在 40 毫秒后开始并成为第二帧。此后,第二帧将正确复制,直到十秒标记(10.040???)。我通过复制第一帧来解决这个问题。

答案2

开始之前:

  • -qscale不是输入选项,应放置在 -i

  • -qscale选项适用于 MPEG-4 Part II 视频,不适用于mp4默认使用的 h.264 视频。它可能会被忽略。使用-crf 20(或 19 到 24 之间的其他合理值)来更改质量。

  • 您的输入解析不正确,也许尝试强制image2

    ffmpeg -r 0.15 -f image2 -i /var/www/44693/%0d.jpg /var/www/44693/output11.mp4
    
  • 无论如何,您的编解码器帧速率和容器帧速率不匹配,这是不应该发生的。

  • 如果失败,请使用较新版本的 FFmpeg。对于 Ubuntu,遵循本指南

答案3

看起来这是一个错误,看看https://ffmpeg.org/trac/ffmpeg/ticket/1925 解决方法是使用“-vf fps=XX”而不是“-r”(或复制第一帧)。

相关内容