Verbessere die Qualität der von ffmpeg erstellten JPGs


29

Ich verwende ffmpeg, um einen mjpeg-Feed von einer IP-Kamera aufzunehmen und in eine Reihe von Standbildern zu konvertieren. Hier ist der Befehl, den ich benutze:

ffmpeg -i http://xxx:xxx@xx.xx.xx.xx/vid.mjpg -f image2 -vcodec mjpeg %05d.jpg

Kennt jemand eine Möglichkeit, den Grad der JPG-Komprimierung festzulegen, wenn ffmpeg zum Erstellen von Standbildern verwendet wird?

Antworten:


36

Hier ist, was den Trick für mich getan hat:

ffmpeg -i http://xx.xx/mjpg/video.mjpg -q:v 1 %05d.jpg

Das -q:v 1war das Ticket. Hiermit wird die Qualität des Video-Encoders festgelegt, wobei die -qMittelwertqualität und die :vMittelwertvideoqualität festgelegt werden. Die Werte reichen von 1 bis 31, wobei niedriger besser ist.


2
Ich weiß nicht, ob dies vor Jahren verfügbar war, aber wenn Sie möchten, dass die Quell-JPEG-Bilder von MJPEG unverändert bleiben, finden Sie die Antwort hier: ffmpeg.org/ffmpeg-bitstream-filters.html#mjpeg2jpeg ---- Kurz gesagt: -c:v copy -bsf:v mjpeg2jpegstatt q:v 1.
Juanitogan

1
Weiß jemand, welchen Standardwert es verwendet?
Jay R. Wren

@ JayR.Wren Ich habe einige Tests durchgeführt und in meinem Fall scheint es niedrig (gut) zu beginnen und steigt nach ein paar Sekunden auf 24,8 (schlecht). Ich weiß nicht warum. ffmpegs zeigt die aktuelle Qualität als q. Hier ist es zum Beispiel 24.8frame= 64 fps=5.0 q=24.8 Lsize=N/A time=00:00:16.00 bitrate=N/A dup=10 drop=299 speed=1.25x
problemofficer

6

$ ffmpeg -r 1/4 -i %03d.jpg -b 5000 -vcodec mjpeg -qscale 1 5000.avi

ODER

$ ffmpeg -r 1/4 -i %03d.jpg -vcodec copy -qscale 1 copy.avi

Referenz:

r       delay between next jpg, results 4 second
b       bitrate
vcodec  use jpeg encode
qscale  quality ratio

"konkurriert" qscale mit dem Bitraten-Spezifizierer?
Rogerdpack

1
Ist das nicht das Gegenteil von dem, was gefragt wird? Das sieht aus wie JPEG zu MJPEG. mjpeg zu jpeg ist die frage.
Juanitogan

4

Sie können versuchen, in PPM zu exportieren und mit einem anderen Tool in JPEG zu konvertieren.

Ich habe in ffmpeg / libavcodec / mjpeg.c nachgesehen. Ich glaube, die Qualität ist auf einen festen Wert festgelegt.

Außerdem scheinen Sie ein MJPEG-Video in JPEG-Standbilder umzuwandeln. Ich denke in diesem Fall läuft der Code in ffmpeg / libavcodec / mjpeg2jpeg_bsf.c und die Daten werden nicht neu codiert. Die Bildqualität würde sich also sowieso nicht verbessern.

Dies ist die Quantisierungstabellendefinition. Ich habe keinen Verweis auf * val_? C gesehen, bei dem die Werte vor der Verwendung skaliert wurden.

/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
/* IMPORTANT: these are only valid for 8-bit data precision! */
const uint8_t ff_mjpeg_bits_dc_luminance[17] =
{ /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
const uint8_t ff_mjpeg_val_dc[12] =
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };

const uint8_t ff_mjpeg_bits_dc_chrominance[17] =
{ /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };

const uint8_t ff_mjpeg_bits_ac_luminance[17] =
{ /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
const uint8_t ff_mjpeg_val_ac_luminance[] =
{ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,

Ich kenne mich mit PPM nicht aus. Was ist das?
Weotch

Außerdem sehen die Bilder besser aus, wenn ich über den Browser auf die Kamera zugreife, als die von mir erstellten JPEGs. Deshalb habe ich gedacht, dass eine Komprimierung stattfindet.
Weotch

PPM ist das einfachste Farbbildformat, das man sich vorstellen kann. Es ist nur ein Header wie "P6 640 480 255 \ n" und dann die Rohdaten. Ich habe nur geschaut. Vielleicht kann es dieses Format tatsächlich nicht ausgeben. Die einzige andere Option wäre dann -vc rawvideo. Hast du -quality ausprobiert?

1
-vcodec ppmwird benötigt um ppm zu exportieren
Stop Harming Monica
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.