
Я следую этому документу с сайта ffmpeg:
Это будет создавать одну миниатюру изображения каждую минуту с именами img001.jpg, img002.jpg, img003.jpg, ... (%03d означает, что порядковый номер каждой миниатюры изображения должен быть отформатирован с использованием 3 цифр)
ffmpeg -i myvideo.avi -f image2 -vf fps=fps=1/60 img%03d.jpg
Это будет создавать одно миниатюрное изображение каждые 10 минут с именами thumb0001.bmp, thumb0002.bmp, thumb0003.bmp, ...
ffmpeg -i test.flv -f image2 -vf fps=fps=1/600 thumb%04d.bmp
Но если я использую параметры 1/600, это не работает и выдает следующую ошибку:
ffmpeg -i src/e0b4c83e7ab2ada44c2785d25b0d4a9d45fc0c66.3gp -f image2 -vf fps=fps=1/250 thumbs/images%d.jpg
ffmpeg version 1.0.3 Copyright (c) 2000-2012 the FFmpeg developers
built on Oct 13 2013 21:48:31 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-3)
configuration:
libavutil 51. 73.101 / 51. 73.101
libavcodec 54. 59.100 / 54. 59.100
libavformat 54. 29.104 / 54. 29.104
libavdevice 54. 2.101 / 54. 2.101
libavfilter 3. 17.100 / 3. 17.100
libswscale 2. 1.101 / 2. 1.101
libswresample 0. 15.100 / 0. 15.100
Guessed Channel Layout for Input Stream #0.1 : mono
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'src/e0b4c83e7ab2ada44c2785d25b0d4a9d45fc0c66.3gp':
Metadata:
major_brand : 3gp4
minor_version : 512
compatible_brands: isomiso23gp4
creation_time : 2013-11-27 14:02:52
Duration: 00:05:01.33, start: 0.000000, bitrate: 177 kb/s
Stream #0:0(und): Video: h263 (s263 / 0x33363273), yuv420p, 176x144 [SAR 12:11 DAR 4:3], 161 kb/s, 15 fps, 15 tbr, 15 tbn, 29.97 tbc
Metadata:
creation_time : 2013-11-27 14:06:48
handler_name : VideoHandler
Stream #0:1(und): Audio: amr_nb (samr / 0x726D6173), 8000 Hz, mono, flt, 12 kb/s
Metadata:
creation_time : 2013-11-27 14:06:48
handler_name : SoundHandler
[mjpeg @ 0x3621940] bitrate tolerance too small for bitrate
[mjpeg @ 0x363c1c0] ff_frame_thread_encoder_init failed
Output #0, image2, to 'thumbs/images%d.jpg':
Metadata:
major_brand : 3gp4
minor_version : 512
compatible_brands: isomiso23gp4
Stream #0:0(und): Video: mjpeg, yuvj420p, 176x144 [SAR 12:11 DAR 4:3], q=2-31, 200 kb/s, 90k tbn, 0k tbc
Metadata:
creation_time : 2013-11-27 14:06:48
handler_name : VideoHandler
Stream mapping:
Stream #0:0 -> #0:0 (h263 -> mjpeg)
Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
Почему 1/60 работает, а 1/600 нет? Как это исправить? Также обновление сервера не вариант.
решение1
Я пока не знаю, почему настройки по умолчанию для вывода jpg при использованииfps
видеофильтрпри определенных значениях возникают ошибки:
[mjpeg @ 0x3621940] bitrate tolerance too small for bitrate
[mjpeg @ 0x363c1c0] ff_frame_thread_encoder_init failed
Пример
Обходной путь — использовать опцию -qscale:v
(или псевдоним -q:v
):
ffmpeg -i input.mkv -vf fps=1/250 -qscale:v 2 output%d.jpg
Примечания
Эффективный диапазон
-qscale:v
при выводе в jpeg — линейная шкала от 2 до 31. Более низкое значение соответствует более высокому качеству.-f image2
не нужен.Вы также можете опустить дополнительный аргумент,
fps=
как показано в моем примере.Другим решением является использование другого выходного формата, например png, но это может оказаться неприемлемым для вас решением.
Другим возможным решением является использование
select
видеофильтрвместо этого, но это не так удобно для пользователя.Использование
-threads 1
устраняетff_frame_thread_encoder_init failed
ошибку, но не другую ошибку.Те же ошибки возникают при использовании
-r
вместо фильтраfps
.
Я обновлю этот ответ, если узнаю больше (у меня не было времени провести надлежащее расследование...).