Создание эскизов с помощью FFmpeg - PullRequest
4 голосов
/ 17 ноября 2011

Я использую FFmpeg для извлечения миниатюр из определенных позиций видеофайлов.

Я нашел в Интернете два подхода для этого:

  1. С параметром -ss (поиск) перед -i (вход) параметром:

    ffmpeg -y -ss $SEEK_POINT -i input.ogv -vcodec mjpeg -vframes 1 -an -s 120x90 -f rawvideo output.jpg

  2. С параметром -ss (поиск) после параметра -i (вход):

    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 голосов
/ 20 ноября 2011

Попробуйте что-то подобное с опцией itsoffset:

ffmpeg -itsoffset 4 -i "$INFILE" -vcodec png -vframes 1 -an -f rawvideo -s 120x90 -y "$OUTFILE"

Из документации FFmpeg по itsoffset:

Установите смещение времени ввода в секундах.[-] чч: мм: сс [.xxx] синтаксис также поддерживается.Смещение добавляется к временным меткам входных файлов.Указание положительного смещения означает, что соответствующие потоки задерживаются на секунды смещения.

...