Как я могу извлечь изображение JPEG хорошего качества из видеофайла H264 с помощью ffmpeg?

110

В настоящее время я использую эту команду для извлечения изображений:

ffmpeg.exe -i 10fps.h264 -r 10 -f image2 10fps.h264_% 03d.jpeg

Но как я могу улучшить качество изображения JPEG?

Даниэль Гартманн
источник
1
Что не так с нынешним качеством, кроме того, что оно не "хорошее"?
bjoernz

Ответы:

218

Использовать -qscale:v

Используйте -qscale:v(или псевдоним -q:v) как вариант вывода. Эффективный диапазон для JPEG - 2-31, где 31 - худшее качество. Я рекомендую попробовать значения 2-5.

Чтобы вывести серию изображений:

ffmpeg -i input.mp4 -qscale:v 2 output_%03d.jpg

Чтобы вывести одно изображение длительностью ~ 60 секунд:

ffmpeg -ss 60 -i input.mp4 -qscale:v 4 -frames:v 1 output.jpg

Это будет работать с любым видеовходом. См. Ниже, если ваш ввод - MJPEG.


MJPEG

Если ваш входной файл - MJPEG (Motion JPEG), изображения можно извлечь без потери качества.

ffmpegИли ffprobeконсольный вывод может сказать вам , если ваш вход MJPEG:

$ ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=nw=1 input.avi
codec_name=mjpeg

Затем вы можете извлечь кадры с помощью mjpeg2jpegфильтра битового потока :

$ ffmpeg -i input.avi -codec:v copy -bsf:v mjpeg2jpeg output_%03d.jpg

Также см

llogan
источник
На меня это, похоже, не повлияло - qscale 1 и 2 дают одинаковые размеры файлов и (на мой взгляд) выглядят так же, как и без qscale.
felwithe
Можете ли вы опубликовать полную командную строку, которую вы используете? Также, пожалуйста, опубликуйте полный неразрезанный вывод ffmpeg в командной строке. Обратите внимание, что размещение параметров имеет значение, поэтому -qscale: v 2 необходимо поместить после параметра -i inputfile, но перед параметром выходного файла, чтобы иметь какой-либо эффект.
Рональд С. Бултье,
1
Для меня добавления -qmin 1 -qmax 1в дополнение к -q:v 1удвоили размер файла. И я также вижу очень небольшое улучшение.
комплиристический
1
@complistic: приводит -qmin 1 -qmax 1к большему файлу, но дает мне точно такое же изображение. Я проверил это через фотошоп, 2 слоя и фильтр различий. Пиксели такие же.
cherouvim
@Kostanos Можешь попробовать -qmin 1 -q:v 1.
llogan
0

Выведите изображения в формате без потерь, таком как PNG:

ffmpeg.exe -i 10fps.h264 -r 10 -f image2 10fps.h264_%03d.png

Затем используйте другую программу (где вы можете более точно указать качество, субдискретизацию и метод DCT - например, GIMP), чтобы преобразовать нужные PNG в JPEG.

Таким образом можно получить немного более четкие изображения в формате JPEG, чем это возможно при -qmin 1 -q:v 1прямом выводе в формате JPEG ffmpeg.

Джейк
источник
ffmpegвыводит PNG8файлы, в которых используется только 256 цветов (как в GIF). так что на самом деле это очень с потерями.
Lapin
@lapin PNG-файлы, которые я извлек с помощью этого метода, имеют размер 24 бита (даже для кадров с менее чем 256 цветами, хотя у других их намного больше). Это использовало версию 4.2.1 x64 в Windows. Также здесь написано : «Если я возьму png из mp4, с помощью этой команды [ ffmpeg] я получу png высокого качества, идентичного качеству исходного видео». Какую версию ffmpegвы используете для вывода PNG8файлов и какой у вас формат ввода?
Джейк
На самом деле я думаю, что вы правы, проблема заключалась в том, что identify image.pngрезультат был "8-битным", хотя на самом деле это не одноканальный 8-битный, а 8-битный для R, G и B. IDK, как identifyдолжен понимать средний пользователь что то.
лапин