Wie kann ich mit ffmpeg ein JPEG-Bild von guter Qualität aus einer H264-Videodatei extrahieren?

107

Derzeit verwende ich diesen Befehl, um die Bilder zu extrahieren:

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

Aber wie kann ich die JPEG-Bildqualität verbessern?

Daniel Gartmann
quelle
1
Was ist falsch an der aktuellen Qualität, abgesehen davon, dass sie nicht "gut" ist?
Bjoernz

Antworten:

214

Verwenden -qscale:v

Verwenden Sie -qscale:v(oder den Alias -q:v) als Ausgabeoption. Der effektive Bereich für JPEG beträgt 2-31, wobei 31 die schlechteste Qualität ist. Ich empfehle Werte von 2-5 zu versuchen.

So geben Sie eine Reihe von Bildern aus:

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

So geben Sie ein einzelnes Bild mit einer Dauer von ~ 60 Sekunden aus:

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

Dies funktioniert mit jedem Videoeingang. Siehe unten, wenn Ihre Eingabe MJPEG ist.


MJPEG

Wenn Sie MJPEG (Motion JPEG) eingeben, können die Bilder ohne Qualitätsverlust extrahiert werden.

Die Ausgabe ffmpegoder ffprobeKonsole kann Ihnen sagen, ob Ihre Eingabe MJPEG ist:

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

Anschließend können Sie die Frames mit dem mjpeg2jpegBitstream-Filter extrahieren :

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

Siehe auch

llogan
quelle
Dies scheint für mich keine Auswirkung zu haben - qscale 1 und 2 ergeben beide identische Dateigrößen und erscheinen (mit bloßem Auge) genauso wie ohne qscale.
felwithe
Können Sie die vollständige Befehlszeile veröffentlichen, die Sie verwenden? Bitte veröffentlichen Sie auch die vollständige, ungeschnittene Ausgabe von ffmpeg in der Befehlszeile. Beachten Sie, dass die Platzierung von Optionen relevant ist. Daher muss -qscale: v 2 nach der Option -i Eingabedatei, jedoch vor der Option Ausgabedatei platziert werden, um eine Wirkung zu erzielen.
Ronald S. Bultje
1
Für mich hat das Hinzufügen -qmin 1 -qmax 1zusätzlich -q:v 1die Dateigröße verdoppelt. Und ich kann auch eine sehr leichte Verbesserung feststellen.
Komplistische
1
@complistic: -qmin 1 -qmax 1führte zu einer größeren Datei, gibt mir aber genau das gleiche Bild. Ich habe dies über Photoshop, 2 Ebenen und Differenzfilter validiert. Die Pixel sind gleich.
Cherouvim
@Kostanos Du kannst es versuchen -qmin 1 -q:v 1.
Llogan
0

Geben Sie die Bilder in einem verlustfreien Format wie PNG aus:

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

Verwenden Sie dann ein anderes Programm (in dem Sie Qualität, Unterabtastung und DCT-Methode genauer angeben können - z. B. GIMP), um die gewünschten PNGs in JPEG zu konvertieren.

Auf diese Weise können etwas schärfere Bilder im JPEG-Format erhalten werden, als dies mit -qmin 1 -q:v 1JPEG direkt von und bei der Ausgabe als JPEG möglich ist ffmpeg.

Jake
quelle
ffmpeggibt PNG8Dateien aus, die nur 256 Farben verwenden (wie GIF). es ist also eigentlich sehr verlustbehaftet.
Lapin
@lapin Die PNGs, die ich mit dieser Methode extrahiert habe, sind 24 Bit (auch für Frames mit weniger als 256 Farben, obwohl andere viel mehr haben). Dies war die Verwendung von Version 4.2.1 x64 unter Windows. Auch geschrieben hier ist: „Wenn ich PNGs von einem mp4, mit diesem [ziehen ffmpeg] Befehl, ich hohe Qualität png erhalten , die von gleicher Qualität auf dem Original - Video sind.“ Welche Version von verwenden ffmpegSie, die PNG8Dateien ausgibt , und welches Eingabeformat haben Sie?
Jake
Eigentlich denke ich, dass Sie Recht haben, das Problem war, dass identify image.pngdas Ergebnis "8-Bit" ist, wenn es eigentlich nicht wirklich einkanaliges 8-Bit ist, sondern 8-Bit für R, G und B. IDK, wie der durchschnittliche identifyBenutzer verstehen soll das tho.
Lapin