使用FFmpeg创建缩略图

4
我正在使用FFmpeg从视频文件的特定位置提取缩略图。
我在网上找到了两种方法来实现这个目标:
1. 在输入参数-i之前,使用-ss(seek)参数: ffmpeg -y -ss $SEEK_POINT -i input.ogv -vcodec mjpeg -vframes 1 -an -s 120x90 -f rawvideo output.jpg 2. 在输入参数-i之后,使用-ss(seek)参数: ffmpeg -y -i input.ogv -vcodec mjpeg -ss $SEEK_POINT -vframes 1 -an -s 120x90 -f rawvideo output.jpg 第一种方法生成的缩略图带有灰色斑点,但速度非常快。返回的错误为[theora @ 0x8097240] vp3: first frame not a keyframe
第二种方法总是能够工作,但会出现一个错误,导致提取缩略图所需的时间很长。这个时间不固定,而是取决于寻找点,有时只需要几秒钟,有时需要几分钟才能提取缩略图。我会在下面的输出中收到错误Buffering several frames is not supported. Please consume all available frames before adding a new one.
Input #0, ogg, from 'input.ogv':
  Duration: 00:21:52.76, start: 0.000000, bitrate: 844 kb/s
    Stream #0.0: Video: theora, yuv420p, 800x600 [PAR 4:3 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
    Stream #0.1: Audio: vorbis, 44100 Hz, stereo, s16, 192 kb/s
    Metadata:
      ENCODER         : Lavf52.102.0
Incompatible pixel format 'yuv420p' for codec 'mjpeg', auto-selecting format 'yuvj420p'                                                                         
[buffer @ 0x9250840] w:800 h:600 pixfmt:yuv420p                                 
[scale @ 0x92508a0] w:800 h:600 fmt:yuv420p -> w:120 h:90 fmt:yuvj420p flags:0x4
Output #0, rawvideo, to 'output.jpg':
  Metadata:
    encoder         : Lavf53.2.0
    Stream #0.0: Video: mjpeg, yuvj420p, 120x90 [PAR 4:3 DAR 16:9], q=2-31, 200 kb/s, 90k tbn, 25 tbc
Stream mapping:
  Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
[buffer @ 0x9250840] Buffering several frames is not supported. Please consume all available frames before adding a new one.                                    
frame=    0 fps=  0 q=0.0 size=       0kB time=10000000000.00 bitrate=   0.0kbit
Last message repeated 15448 times
frame=    1 fps=  0 q=3.4 Lsize=       3kB time=0.04 bitrate= 598.8kbits/s    
video:3kB audio:0kB global headers:0kB muxing overhead 0.000000%

我该如何使用FFmpeg从视频的自定义位置无论输入格式都无问题地提取缩略图?
1个回答

4
尝试使用 itsoffset 选项来实现类似以下的效果:
ffmpeg -itsoffset 4 -i "$INFILE" -vcodec png -vframes 1 -an -f rawvideo -s 120x90 -y "$OUTFILE"

来自FFmpeg文档关于itsoffset:

设置输入时间偏移量,单位为秒。也支持[-]hh:mm:ss[.xxx]语法。该偏移量将添加到输入文件的时间戳中。指定正偏移量意味着相应的流将被延迟delay秒。


1
不,它不起作用。每次运行时,它只从视频中提取第一帧,无论我设置 -itoffset 参数为何。你有任何想法吗? - Calin-Andrei Burloiu
5
对于后来发现此问题的任何人,我很抱歉回复晚了。我认为参数“-itsoffset”应该是负数。在这种情况下,“-4”表示您希望将视频流向早移动,而不是延迟它。 - runfalk

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