MotionJPEG-Codec-Vergleich

  • Tja, ich mal wieder.

    War ich doch tatsächlich der Meinung, man könne MJPEG-Codecs einfach mal so miteinander vergleichen. Leider war es nicht so einfach, wie ich am Anfang dachte. Aber dazu mehr im Laufe der Erklärungen...
    __

    Zunächst versuchte ich herauszufinden, welcher Codec mit welcher Geschwindigkeit encodieren kann. Dazu besorgte ich mir folgende Codecs:

    - ffdshow 2005-07-03 von celtic-druid
    - Lead Technologies MCMP/MJPEG Video Codec 1.0.0.16
    - MainConcept MJPEG Codec 3.2.4
    - Morgan M-JPEG Codec 3.0.0.9
    - PICVideo M-JPEG Codec 3.0.0.12

    Mit ein wenig Geschick kriegt man sie sogar alle parallel zum Laufen, PICVideo darf dafür nicht der primäre MJPG-Codec sein.

    Um nun eine halbwegs brauchbare Videoquelle zu bekommen, ohne eine TV-Karte zu besitzen (ja, ja ...), verwendete ich folgendes AviSynth-Skript, das trotz seiner Einfachheit die Schwächen der Codecs überraschend gut zeigte:

    PHP
    ColorBars(704,576,"YUY2")     # Testbild
    KillAudio()                   # Tonspur - brauchen wir nicht
    AssumeFPS(25.0)               # PAL bitte
    Trim(0,-1500)                 # 1 Minute reicht
    AssumeFrameBased()            # nur zur Sicherheit
    AssumeTFF()                   # bei TV üblich, richtig?
    Info()                        # damit noch ein paar feine Details im Bild sind


    Ein sinnvolleres Skript mit wenig Rechenleistung ist mir nicht eingefallen; hätte ich ein anderes Video als Quelle genommen, hätte das erst mal decodiert oder von Platte gelesen werden müssen, was im Vergleich zur MJPEG-Komprimierung zu viel Zeit gekostet und die Werte zu stark verfälscht hätte.

    Als "Referenz" für die Vergleiche diente zunächst der ffdshow mit seiner Implementation des MJPEG-Codec. Der erlaubt als Qualitätsoption für den Modus "1-pass, constant quantizer" Werte von 1 und 2 - größer muss nicht sein. Dann habe ich versucht, mit den jeweiligen anderen Codecs Dateien zu erzeugen, die in etwa gleiche Dateigröße erzeugen.

    Grund: Jeder Codec definiert die Qualität irgendwie anders. Es würde also nicht viel Sinn machen, irgendwie zu erraten, welche Einstellungen die gleichen Quantisierer erzeugen würden, und dann Qualität und Dateigröße gleichzeitig zu vergleichen. Also war ich der Meinung, nach Möglichkeit die Dateigröße halbwegs gleich zu halten, und nur die Qualität zu vergleichen.

    Dabei bin ich zu folgenden Ergebnissen gekommen (die jeweiligen Einstellungen erzeugen natürlich nur bei diesem künstlichen Test vergleichbare Dateigrößen, reale Aufnahmen dürften wohl leicht andere Verhältnisse bringen):

    ffdshow
    Preis: 0
    Modus: 1-pass const. quant.
    Quant.-Faktor: 1 | 2
    Dateigröße: 94,34 | 75,34 MB
    Geschwindigkeit: ~4250 px/MHz (*)
    Qualität (auf die Smilies klicken): :eek: | :)

    Lead Technologies
    Preis: 9 EUR
    Modus: JPEG 4:2:2
    Quality/Size: 19 | 29
    Dateigröße: 94,25 | 75,62 MB
    Geschwindigkeit: ~4200 px/MHz (*)
    Qualität (auf die Smilies klicken): :) | :hm:

    Lead Technologies
    Preis: 9 EUR
    Modus: LEAD proprietary - ACHTUNG: Anscheinend nicht voll MJPEG-Kompatibel!
    Quality/Size: 27 | 39
    Dateigröße: 95,58 | 75,18 MB
    Geschwindigkeit: ~3760 px/MHz (*)
    Qualität (auf die Smilies klicken): :( | :nein:

    MainConcept
    Preis: 19 EUR
    Modus: Standard
    Qualität: 92 | 84 - ACHTUNG: Dieser Codec verwendet den Qualitätswert aus dem VfW-Dialog!
    Dateigröße: 94,72 | 73,99 MB
    Geschwindigkeit: ~4800 px/MHz (*)
    Qualität (auf die Smilies klicken): :) | :hm:

    Morgan MM
    Preis: 20 EUR
    Modus: 4:2:2
    Forced quality: 92 | 84
    Dateigröße: 95,20 | 74,27 MB
    Geschwindigkeit: ~4720 px/MHz (*)
    Qualität (auf die Smilies klicken): :) | :hm:

    Pegasus PICVideo3 - aktualisiert!
    Preis: 28 USD
    Modus: 4:2:2, "normalisierte Werte" aus!
    Quality: 19 | 18
    Dateigröße: 97,67 | 73,94 MB
    Geschwindigkeit: ~4810 px/MHz (*)
    Qualität (auf die Smilies klicken): :) | :hm:

    Zitat

    (*) Pixel/Megahertz - ist natürlich höchst prozessorabhängig (je nach unterstützter CPU/FPU-Befehlserweiterungen), und sicher auch vom Gesamtsystem stark beeinflußt. Aber mal so als Rechenbeispiel:

    704*576 Pixel/Frame * 1500 Frames / 3:00 Minuten / 800 MHz = 4224 px/MHz

    Wie man sehen kann, sind die Unterschiede zwischen den Encodern hinsichtlich der Geschwindigkeit gar nicht mal so hoch. Wer also die Chance hat, der sollte meiner Meinung nach doch mach Qualität wählen!

    Und dabei sind das nur direkte Screenshots. Eigentlich hatte ich ja vor, Original und Kopie miteinander über Differenz und PSNR zu vergleichen. Aber das stellte sich als sinnlos heraus, denn einige Codecs haben wohl unterschiedliche Ansichten davon, was ihnen beim Encodieren vorgesetzt wurde, und wie es wieder zu decodieren sei: Manche Codecs gehen von PC-Scale aus, andere von TV-Scale. Zumindest einer erzeugte sogar Ergebnisse, bei denen ich nicht wusste, wie ich die wieder hätte korrigieren sollen...

    Und noch eines war sehr merkwürdig: Ich habe sämtliche Screenshots (ausgenommen das proprietäre LEAD-Video, hier kam der VfW-Codec zum Einsatz) nach dem Ergebnis erzeugt, das der VirtualDub-interne MJPEG-Decoder erstellt (File - Open: show extended options - Use internal M-JPEG decoder). Dabei musste ich beim Öffnen des MainConcept- und des Morgan-Videos zusätzlich die Option "Swap fields" wählen. Ich finde es recht sonderbar, dass die Field-Reihenfolge nicht korrekt erkannt wird.

    Bei PICVideo ist außerdem eine leichte Kontrasterhöhung festzustellen. Ich werde später noch mal testen, ob das an der Encoder-Einstellung "Encode normalized YUV" liegen kann. Oder es weiß zufällig jemand, was das bedeutet und ob/wann man es ein-/ausschalten sollte.

    __

    P.S.: Sehe gerade, dass die verlinkten PNG-Bilder in Opera total kaputt aussehen, in IrfanView dagegen einwandfrei. Werde sie noch mal recodieren...

  • Danke Ligh,

    sehr brauchbarer test. Ich habe es zwar mittlerweile aufgund meines schlechten analogen Signals aufgegeben analoge Captures zu bearbeiten, manchmal kommt der mjpg-codec, denn aber dennoch zum Einsatz.
    Wäre schön gewesen wenn du noch einen Screenshot von der Avisynth-Quelle gemacht hättest. Naja, kann man sich mit deinen Script ja auch selber erstellen.

    Tatsächlich sieht ffdshow für mich ziemlich deutlich am besten in diesen Beispielen aus. Zudem ist es ja auch noch der einzige kostenlose mjpg-codec :ja:

    Wie wäre es denn demnächst mit einen DV-Codec Test. Zur Zeit nutze ich auch dafür ffdshow (weil frei erhältlich), aber weiß nicht so ganz, wie es mit der Qualität aussieht. :zunge:

  • DV kann ich hier nicht gebrauchen. Insbesondere, weil 1) die verwendete Chroma-Subsampling-Variante nicht vorteilhaft ist, und 2) keine Regelung der Bitrate bzw. Qualität vorgesehen ist.
    __

    Screenshot-Aktualisierungen dauern noch etwas. Das PNGOUT-Plugin IST DER TECHNISCHE WAHNSINN !!!, aber es braucht doch seine Zeit. Bis zu einem Viertelstündchen, wenn man will.

  • Ich hab' schon gedacht, von welchen Bildern redet Ihr hier alle, bis ich gemerkt habe, dass damit die Smilies gemeint sind... :seher:

    Gruß, zisoft

  • Mal ein paar Anmerkungen.

    Es gibt keine spezifikation für MJPEG. Erst für MJPEG200, welches aber auf JPEG2000 basiert und nicht auf JPEG wie es bei dem normalen MJPEG der Fall ist.
    Darum gibt es desöffteren incompatibilitäten zwischen den Codecs. Desweiteren wurden die Codecs eher zur decodierung und recodierung erstellt und nicht zum direktem aufnehem. Dies kam erst spähter als die Systeme schnelle genug wurden(besponders die HDs).

    AC-Sama(Robert Vincenz)
    (werde für das -Chan zu alt :zunge: )

  • Wenigstens eine gleichartige Speicherung des Flags "TFF/BFF" wäre schon nett gewesen...
    __

    Geändert: "Bitte auf -Bilder-|+Smilies+ klicken."

    So, die jeweils linken Screenshots (Q1) wurden ausgetauscht. Weiter mit den rechten (Q2).
    __

    Fertig, alle Bilder optimiert und sichtbar.

  • Super Test!

    Bei fddshow... die beiden bilder sind nicht die selben oder?
    ich kann bei besten willen kein unterschied feststellen. das sind ja immerhin 20mb unterschied.

    -edit-
    es sind nicht die selben. ichhab den monitor mal heller gedreht so sieht man es besser.

  • Also, ich kann qualitätsmäßig gar keine großartigen Unterschiede feststellen. Da greift man doch noch viel lieber zum kostenlosen fddshow...?

  • Keine Unterschiede? Dann vergrößere mal nach einer leichten Gamma-Korrektur - wem dann die Ring-Artefakte um den Text und die Bänder an den Farbflächengrenzen nicht auffallen, der braucht 'ne Brille! ;)
    __

    Was ich leider nicht testen kann, ist:

    - Handhabbarkeit beim Capturing (soll Codecs geben, die da nicht gut arbeiten)
    - Encodiergeschwindigkeit beim Capturing (ganz wichtig in dieser Forenrubrik...)
    - Qualitäts-Verhalten bei echten Aufnahmen (okay, evtl. mal die VQEG-Samples testen)


    Die Geschwindigkeits-Verhältnisse gerade bei aktuellen Prozessoren würden mich auch mal interessieren! Bleibt der Pixelspeed (px/MHz) in etwa konstant?

  • Zitat von LigH

    Wenigstens eine gleichartige Speicherung des Flags "TFF/BFF" wäre schon nett gewesen...

    Assumetff/bff() ist NUR AVISynth-intern verwendbar und wird auch nur intern im script ausgewertet.

    dieses Flag gelangt nicht nach aussen. denn es ist im AVI-container kein Fieldorder-flag vorgesehen. und im YUY2-rohdaten-"Codec" schon garnicht, denn ihm ist es reichlich egal, ob das Video nun Progressiv oder interlaced ist, denn er bastelt nicht an der vertikalen linienstruktur.

  • Aber ein MJPEG-Codec sollte hoffentlich eventuell in der Lage sein, die Reihenfolge zu speichern. Einige Codecs haben ja auch eine Option "Swap fields". Nur eben schade, dass man nicht weiß, ob TFF oder BFF für sie "normal" ist, wenn man den Interlaced-Modus aktiviert hat (in den vorliegenden Versuchen: "automatisch, wenn mehr als 288 Zeilen").

  • TFF oder BFF ist VÖLLIG wurscht, weils eh nur Framebasiert arbeitet und sich nicht um TEMPORALE angelegenheiten kümmert.
    Und wenn man ein AVI in AVS lädt, legt AVS immer BFF als Standard fest. obs nun stimmt oder nicht, ist egal.
    Die Software *kann* ja garnicht die Fieldoredr eines AVIs kennen. Denn es gibt kein Flag dafür.

    Und swapfields ist bloß ein zugeständnis an die fehlerhaften Capture-Treiber, die schon geswappte fields ausgegeben haben...

    oder es ist ein Zeichen der Faulheit, wenn En- und DeCoder nicht symmetrisch arbeiten, d.h. einer von beiden die Fields IMMER swappt...

    Merke: Swapfields != Fieldorder.

    Du kannst solange Fieldswappen, bis Du tot bist. die Fieldoredr wird das NICHT änedern.

    (C²H5OH im Blut erzeugt Rechtschraibfehler....)

  • :cheers:
    __

    Field-Swaps sind jedenfalls höchst ärgerlich. Und ich war sehr sauer, dass ich feststellen musste: Der selbe Decoder (grundsätzlich immer VirtualDub's eigener MJPEG-Decoder) stellte alle MJPEG-AVIs richtig dar, nur bei MainConcept und Morgan MM musste ich "Swap Fields" im Decoder einschalten, damit mir nicht die Zeilen vertauscht wurden.
    Doof, das!!! :motz:

  • Ich hab mir die Bilder nochmal angeschaut. Dabei viel mir auf, dass in fddshow die Farbe der Schrift anders ist. Leichtes grau im gelb.
    Die restlichen Codecs stellen die Schrift in einem satten gelb dar.

    Nun welche farbe ist wohl richtig... und wie wertet man das in bezug auf die Qualität?

  • Im Grunde fehlt ja noch ein PSNR/SSIM-Duell gegen eine reale Aufnahme. Vielleicht probier ich das noch mit den VQEG-Schnipseln. Oder jemand anderes hier macht da mal mit...

  • Zitat von z80

    Ich hab mir die Bilder nochmal angeschaut. Dabei viel mir auf, dass in fddshow die Farbe der Schrift anders ist. Leichtes grau im gelb.
    Die restlichen Codecs stellen die Schrift in einem satten gelb dar.

    Nun welche farbe ist wohl richtig... und wie wertet man das in bezug auf die Qualität?

    Da liegt eben der Haken, wie eben die divers. Enkoder enkodieren und auch dekodieren. Da man nicht genau weiss, was da via Vdubs internen mjpeg decoder an Algorhythmen genutzt wird, kann man da eh nicht sicher gehen.

    Am besten mal den ffdshow (libavcodec) mjpeg stream via FFdshows vfw mjpeg komponente in Vdub dekodieren lassen und nachsehen, wie die Farben sodann rüberkommen.

  • So, Leute - jetzt geht's um die Wurst!

    Als Testmaterial kamen diesmal die VQEG-Testsequenzen (für PAL) zum Einsatz. Außerdem hab ich es hingekriegt, dass alle Videos von ihren jeweiligen Codecs decodiert werden, von denen sie auch erzeugt wurden. Wenn dabei ein Codec technisch nicht in der Lage war, YUY2 auszugeben :eek: (LeadTech: "the video decompressor couldn't produce YUY2 output") - Pech gehabt, das gibt beim Umwandeln nach YV12 (damit SSIM funktioniert) natürlich von RGB24 aus eher leicht höhere Ungenauigkeiten.

    Bei einigen Codecs musste {1} "SwapFields()" eingefügt werden, bei anderen {2} "ColorYUV(Levels="TV->PC")", um wieder den gleichen Inhalt wie vor dem Komprimieren zu erzeugen.

    Verglichen wurde mit folgendem Skript:

    PHP
    LoadPlugin("CompareYV12.dll")
    LoadPlugin("SSIM.dll")
    orig = Import("PAL_YUY2.avs").ConvertToYV12(interlaced=true)
    copy = AviSource("MJPEG.avi",false) {1} .ConvertToYV12(interlaced=true) {2}
    ssim = SSIM(orig,copy,"report.csv","report.txt",lumimask=2) # On2-Version von SSIM
    comp = CompareYV12(orig,copy,"YUV","report.log")
    diff = Subtract(orig,copy)
    comp.Overlay(ssim).Overlay(diff)


    Ergebnisse:

    ffdshow
    Preis: 0
    Modus: 1-pass const. quant.
    Quant.-Faktor: 1 | 2
    Dateigröße: 457,41 | 308,91 MB
    Geschwindigkeit: ~4110 px/MHz
    PSNR: 44,40 | 43,33 :eek:
    SSIM: 93,54 | 88,96 :eek:

    Lead Technologies {2}
    Preis: 9 EUR
    Modus: JPEG 4:2:2
    Quality/Size: 17 | 25
    Dateigröße: 451,64 | 318,84 MB
    Geschwindigkeit: ~4530 px/MHz
    PSNR: 40,18 | 36,60
    SSIM: 83,32 | 70,96

    Lead Technologies {2}
    Preis: 9 EUR
    Modus: LEAD proprietary - ACHTUNG: Anscheinend nicht voll MJPEG-kompatibel!
    Quality/Size: 17 | 28
    Dateigröße: 452,24 | 315,51 MB
    Geschwindigkeit: ~3920 px/MHz
    PSNR: 35,38 | 33,45 :nein:
    SSIM: 65,97 | 56,31 :nein:

    MainConcept
    Preis: 19 EUR
    Modus: Standard
    *VfW-Qualität*: 94 | 89
    Dateigröße: 440,74 | 314,04 MB
    Geschwindigkeit: ~5410 px/MHz
    PSNR: 43,41 | 39,65
    SSIM: 89,33 | 81,21

    Morgan MM
    Preis: 20 EUR
    Modus: 4:2:2
    Forced quality: 94 | 89
    Dateigröße: 445,27 | 318,09 MB
    Geschwindigkeit: ~4710 px/MHz
    PSNR: 43,48 | 39,68
    SSIM: 89,46 | 81,31

    Pegasus PICVideo3 {1}
    Preis: 28 USD
    Modus: 4:2:2, "normalisierte Werte" aus!
    Quality: 19 | 18
    Dateigröße: 400,54 | 261,32 MB (*)
    Geschwindigkeit: ~5360 px/MHz
    PSNR: 41,77 | 37,49 (*)
    SSIM: 86,34 | 74,72 (*)

    (*) Niedrigere Qualität sicherlich aufgrund geringerer Dateigröße; auf Feintuning an den beiden Kompressionsparametern (Y/C) wurde hier verzichtet
    __ _ _

    Mein bisheriges Fazit:

    Wer bisher immer noch aus Gewohnheit seinen altbekannten Motion-JPEG-Codec weiter verwendet hat, der sollte vielleicht mal selber testen, ob es sich mittlerweile doch um eine "schlechte Angewohnheit" handelt. ;)

    Insbesondere dürfte es interessant sein, ob man sich für die bessere Qualität eventuell eine etwas längere Rechenzeit leisten kann, je nach CPU.

  • Hätte aufgrund dieser Ergebnisse nun versucht statt wie bisher mit PICVideo MJPEG V2 Q=19 mal versuchsweise mit ffdshow Q=2 zu capturen, was lt. PSNR/SSIM ja bessere Ergebnisse liefert.

    Interessant ist, dass ich mit PICVideo Q=19 ohne Drops capturen kann. Mit ffdshow Q=2 hingegen treten bei meinem System bereits dropped Frames auf. Trotz geringerer Datenmenge fordert ffdshow Q=2 also anscheinend das System mehr als PICVideo Q=19.

    Vermuteter Grund: ffdshow verlangt meiner CPU (AMD 1,4 GHz) bereits 80 % Auslastung ab. PICVideo hingegen nur 40 %. Evtl. liegts ja an den ffdshow-Einstellungen? Bin kompletter ffdshow-Newbie; anbei ein Export meiner Settings (ZIP enthält ffdshow-Export-REG-File).

    LigH
    vielleicht kannst du auch den PICVideo MJPEG V2 noch mitaufnehmen, denn der wir vmtl. noch von sehr vielen verwendet?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!