Як я можу витягти JPEG-зображення хорошої якості з відеофайлу H264 за допомогою ffmpeg?


108

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

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

Але як я можу покращити якість зображення JPEG?


1
Що не так з поточною якістю, окрім того, що вона не є «хорошою»?
bjoernz

Відповіді:


215

Використовуйте -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

Також див


Це, здається, не впливає на мене - qscale 1 і 2 надають однакові розміри файлів і (моїм неозброєним оком) здаються такими ж, як і без qscale.
Felwithe

Чи можете ви розмістити повний командний рядок, який ви використовуєте? Також, будь ласка, розмістіть повний, необрізаний вихід з ffmpeg в командному рядку. Зауважте, що розміщення параметрів є релевантним, тому -qscale: v 2 потрібно розмістити після параметра -i вхідного файлу, але перед параметром вихідного файлу, щоб мати будь-який ефект.
Рональд С. Бултьє

1
Для мене додавання -qmin 1 -qmax 1крім того, щоб -q:v 1подвоїти розмір файлу. І я, здається, також бачу дуже незначне поліпшення.
компілістичний

1
@complistic: -qmin 1 -qmax 1призвів до більшого файлу, але дає мені точно таке ж зображення. Я підтвердив це через Photoshop, 2 шари та фільтр різниці. Пікселі однакові.
cherouvim

@Kostanos Ви можете спробувати -qmin 1 -q:v 1.
логіан

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 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повинен розуміти середній користувач що тхо.
Лапін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.