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

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

ffmpeg -i input.mp4 output_%03d.jpeg

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


person Daniel Gartmann    schedule 19.04.2012    source источник
comment
Что не так с нынешним качеством, кроме того, что оно плохое?   -  person bjoernz    schedule 19.04.2012


Ответы (2)


Используйте -qscale:v для контроля качества

Используйте -qscale:v (или псевдоним -q:v) как вариант вывода.

  • Нормальный диапазон для JPEG - 2-31, где 31 - наихудшее качество.
  • Масштаб линейный, удвоение qscale составляет примерно половину битрейта.
  • Рекомендую попробовать значения от 2 до 5.
  • Вы можете использовать значение 1, но вы должны добавить опцию вывода -qmin 1 (поскольку по умолчанию используется -qmin 2).

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

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

Для непрерывной перезаписи / обновления / сохранения в одно изображение

Используйте параметр -update 1 мультиплексора изображений. Пример для одного раза в секунду из входа прямой трансляции:

ffmpeg -i rtmp://input.foo -q:v 4 -r 1 -update 1 output.jpg

Также см

person llogan    schedule 19.04.2012
comment
Похоже, на меня это не повлияло - qscale 1 и 2 дают одинаковые размеры файлов и (на мой взгляд) выглядят так же, как и без qscale. - person felwithe; 29.01.2015
comment
Можете ли вы опубликовать полную командную строку, которую вы используете? Также, пожалуйста, разместите полный неразрезанный вывод ffmpeg в командной строке. Обратите внимание, что размещение параметров имеет значение, поэтому -qscale: v 2 необходимо поместить после параметра -i inputfile, но перед параметром выходного файла, чтобы иметь какой-либо эффект. - person Ronald S. Bultje; 12.04.2015
comment
Для меня добавление -qmin 1 -qmax 1 в дополнение к -q:v 1 удвоило размер файла. И я также вижу очень небольшое улучшение. - person complistic; 27.06.2015
comment
@complistic: -qmin 1 -qmax 1 приводит к увеличению размера файла, но дает мне точно такое же изображение. Я проверил это через фотошоп, 2 слоя и фильтр различий. Пиксели такие же. - person cherouvim; 30.11.2015
comment
@Kostanos Можешь попробовать -qmin 1 -q:v 1. - person llogan; 15.10.2017
comment
@LordNeckbeard Эффективный диапазон для JPEG - 2-31, где 31 - худшее качество .. почему -q: v 1 не находится в эффективном диапазоне? - person Android Developer; 08.12.2018
comment
@BhuvneshVarma Потому что, если я правильно помню (пока не могу проверить), -qmin по умолчанию 2. Вы можете попробовать -q:v 1, если добавите -qmin 1. - person llogan; 08.12.2018
comment
При выполнении вашей последней команды произошла ошибка: Кодек 'h264' (27) не поддерживается фильтром битового потока 'mjpeg2jpeg'. Поддерживаемые кодеки: mjpeg (7) Ошибка инициализации фильтра битового потока: mjpeg2jpeg. - person Luis A. Florit; 27.07.2020
comment
@ LuisA.Florit Эта команда предназначена только для входных данных MJPEG: Если ваш входной файл - MJPEG (Motion JPEG), тогда изображения могут быть извлечены без какой-либо потери качества. Кажется, что вы введены в формате H.264, поэтому вы Придется использовать первую команду. - person llogan; 28.07.2020
comment
Действительно, извините, меня смутило сообщение об ошибке. Поддерживаемые кодеки: mjpeg. - person Luis A. Florit; 29.07.2020

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

mkdir stills
ffmpeg -i my-film.mp4 -vsync 0 -f image2 stills/my-film-%06d.png

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

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

Если вы хотите извлечь только ключевые кадры (которые, вероятно, будут иметь более высокое качество после редактирования), вы можете использовать что-то вроде этого:

ffmpeg -skip_frame nokey -i my-film.mp4 -vsync 0 -f image2 stills/my-film-%06d.png

Параметр -vsync 0 избавляет от необходимости указывать частоту кадров с помощью -r и означает, что все кадры во входном файле обрабатываются как, гм, кадр.

person Jake    schedule 02.11.2019
comment
ffmpeg выводит PNG8 файла, в которых используется только 256 цветов (как в GIF). так что на самом деле это очень с потерями. - person lapin; 17.02.2020
comment
@lapin PNG-файлы, которые я извлек с помощью этого метода, являются 24-битными (даже для кадров с менее чем 256 цветами, хотя у других их намного больше). Это использовало версию 4.2.1 x64 в Windows. Также написано Вот: если я извлечу png из mp4, с помощью этой [ffmpeg] команды я получу png высокого качества, идентичного по качеству исходному видео. Какую версию ffmpeg вы используете для вывода PNG8 файлов и какой у вас формат ввода? - person Jake; 20.02.2020
comment
На самом деле я думаю, что вы правы, проблема заключалась в том, что identify image.png дает результат 8-битный, хотя на самом деле это не одноканальный 8-битный, а 8-битный для R, G и B. IDK, как должен понимать средний identify пользователь что хотя. - person lapin; 20.02.2020
comment
@DonnyV. За комментарий нельзя проголосовать (только «помечено как неуместное»). Рад, что это помогло. Спасибо, что напомнили мне, что я опубликовал это. Я перепроверил пример команды, которую я дал, и обновил свой ответ, чтобы предложить несколько лучших альтернатив, которые больше похожи на то, что я использую сейчас, я знаю немного больше о ffmpeg. - person Jake; 10.12.2020
comment
Я обнаружил, что ваше решение работает для создания высококачественных ключевых кадров, тем не менее, я думаю, что оно должно быть организовано более четко. - person BalrogOfMoria; 04.01.2021