x264: --qp vs. --crf

  • Worin liegt der Unterschied zwischen dem encoding mit --qp oder mit --crf ?

    Ich brauche nicht unbedingt eine genaue Zielgröße einhalten. Viel mehr möchte ich eine Qualität festlegen und immer mit dieser arbeiten. Doch was sollte ich nehmen?

  • --qp steht für "Constand Quantizer". Damit encodierst du den gesamten Film mit einem festgesetzten Quanitizer pro Frame. Damit kannst du die Zielgröße eine Filmes exakt bestimmen, allerdings wird die Qualität sehr stark schwanken.

    --crf steht für "Custom Rate Factor". Du setzt einen Zielquantizer, den der Encoder versuchen wird zu erreichen. Allerdings entscheidet er selbst von Bild zu Bild, inwieweit er davon abweicht. Ist von der Qualität her mit 2-Pass vergleichbar, allerdings ist die Dateigröße relativ unberechenbar. Dafür hast du bei jedem Film die gleiche Qualität.


    -> Das was du suchst ist eindeutig crf.


    Wesentlich besser können das aber nochmals Selur und andere erklären, ich nutz das Zeugs nur, kenn mich mit der Theorie dahinter nicht soo gut aus.

  • Das stimmt nicht ganz!

    Sowohl mit CQP als auch mit CRF ist es unmöglich die finale Größe vorherzusagen! Das ist nur bei 2-Pass oder bei 1-Pass ABR/CBR möglich. Der Unterschied besteht darin, dass CQP mit einem konstanten "Quantizer" arbeitet, CRF dagegen mit konstantem "Rate Factor" (und folglich mit einem variablem Quantizer). Allerdings ist der CRF Modus so austariert, dass man im Durchschnitt ungefähr den vorgegebenen Quantizer erhält. Tatsächlich arbeitet der CRF Modus "intern" sehr ähnlich wie der 2-Pass Modus, nur dass man die Ziel-Bitrate nicht im Vorhinein festlegen kann (dafür aber mit einem Durchgang auskommt). Auch 2-Pass arbeitet mit einem "Rate Factor", skaliert diesen aber zusätzlich im Hinblick auf die vorgegebene Ziel-Bitrate und unter Verwendung der Informationen aus dem ersten Durchlauf. Bei CRF ist das natürlich nicht möglich, da nur ein Durchlauf ausgeführt wird. Würde man aber zuerst einen CRF Encode ausführen und dann mit der daraus resultierenden Bitrate nochmals einen kompletten 2-Pass Encode ausführen, dann erhält man bei beiden Encodes nahezu das selbe Ergebnis (die Abweichungen wären minimal). Wenn man mit einem Durchgang arbeitet, dann ist der CRF Modus praktisch IMMER dem CQP Modus vorzuziehen, da er die Bitrate sehr viel effizienter ausnutzt - anstatt jeden Frame "blind" mit dem selben Quantizer zu enkodieren. Eventuell erzeugt CRF bei gleichem Quantizer-Wert eine kleinere Datei als CQP. Es kann also Sinnvoll sein, den Quantizer-Wert etwas herabzusetzen, wenn man zuvor CQP verwendet hat (z.B. CRF 22 anstatt CQP 26). Bei gleicher Dateigröße ist CRF dem CQP Modus aber immer qualitativ überlegen. Es ist auch zu beachten, dass VAQ (Adaptive Quantisierung) im CQP Modus grundsätzlich deaktiviert ist, bei CRF aber standardmäßig aktiviert ist!


    Ganz genau kann man es hier nachlesen, auch wenn das Doc nich mehr ganz aktuell ist:
    http://git.videolan.org/gitweb.cgi?p=x…b6e075304d902cb

    ("H.264 allows each macroblock to have a different QP. x264 does not do so." stimmt nicht mehr, wenn VAQ verwendet wird)

    Viel mehr möchte ich eine Qualität festlegen und immer mit dieser arbeiten. Doch was sollte ich nehmen?

    CRF ;)

  • @ Bumsfalara

    Das stimmt so nicht ganz. Beides sind Modi, bei denen man die endgültige Größe des Videos nur schwer vorhersagen kann.

    --qp: Constant Quantizer: jedes Bild wird mit dem mathematisch selben Quantizer komprimiert.

    --crf: Constant Rate Factor (aka Constant Quality): hier kann im Gegensatz zu "qp" der Quantizer fluktuieren - der Encoder kann hier also je nach Komplexität des Bildes die Kompression anpassen. Die Idee dahinter ist, mit einer mit "qp" vergleichbaren Qualität kleinere Dateigrößen zu erreichen, indem weniger komplexen Szenen eine niedrigere Bitrate - komplexere Szenen eine höhere Bitrate zugesprochen wird. Mit "crf" erreicht man also genau die Qualität, die man mit einem 2-Pass Encoding mit gleicher Bitrate auch erreichen würde. Das Problem beim 2-Pass Encoding ist nur, dass man hier anfangs eben nicht genau wissen kann, wieviel Bitrate ein Video für ein bestimmtes Maß an Qualität wirklich benötigt.

    Also:

    Erste Wahl ist "crf", da man hier mit der gewünschten gleichbleibenden Qualität bei kleinster Dateigröße encoden kann. Mit "qp" erreicht man ebenso die gewünschte gleichbleibende Qualität - die Dateien werden nur größer als bei "crf". Bei beiden lässt sich Größe des Videos nur schwer vorhersagen. Dafür müsste man Multipass mit einer vorgegebenen durchschnittlichen Bitrate encoden - geht dann aber das Risiko ein, für einen bestimmten Anspruch an Qualität zuviel oder zuwenig Bitrate einzuplanen.

    PS: Ähm, ja, da war MuldeR wohl 3 Minuten schneller als ich. ;)

    Einmal editiert, zuletzt von LigH (12. Oktober 2008 um 17:08) aus folgendem Grund: "@ Bumsfalara" eingefügt, damit der Bezug klar ist

  • Ich auch noch :D *gig*
    kurz gesagt:
    - Beides sind Quantizer basierte 1pass Encoding Modes.
    - Bei qp legt man einen Quantizer fest der für jedes Frame verwendet wird.
    - Bei crf legt man einen durchschnittlichen Quantizer für das File fest.
    - Da man nicht die Größe vorhersagen kann die ein Bild benötigt wenn es mit einem bestimmten Quantizer encoded wird kann man bei keinem der beiden Verfahren die Größe vorhersagen.

    Cu Selur

    Ps.: man x264 und das MeGui Essentials sollten solche Fragen doch eigentlich abdecken,..

  • - Beides sind Quantizer basierte 1pass Encoding Modes.
    - Bei crf legt man einen durchschnittlichen Quantizer für das File fest.

    Nicht ganz. CRF ist eben nicht "Quantizer" basiert, sondern "Rate Factor" basiert - die Quantizer sind ja variabel und werden abhängig vom Rate Factor und dem aktuellen Frame bestimmt. Eigentlich würde man beim CRF Modus keinen Quantizer angeben, sondern einen Rate Factor. Die Entwickler haben jedoch entschieden, dass man auch für den CRF Modus einen Quantizer angibt, um den Benutzer nicht zu verwirren und um den Umstieg von CQP -> CRF zu erleichtern. Intern wird der angegebene Quantizer bei CRF aber in den Rate Factor umgerechnet, der dann für den Encode verwendet wird. Der Umrechnungsfaktor wurde absichtlich so gewählt, dass der CRF Modus im Mittel ungefähr den angegebenen Quantizer liefert. Es ist auch zu beachten, dass bei CRF+VAQ die Quantizer nicht mehr pro Frame sondern pro Macro-Block vergeben werden. Außerdem ist VAQ seit r968 Bestandteil der Komplexitätsberechnung, die von CRF verwendet wird.

  • war auch ein "kurz gesagt:" :D
    (Du hast bei Deiner längeren Erklärung auch nicht noch erklärt was man sich unter Quantizern und "Rate Factor" vorstellen soll ;) und wenn nicht klar ist, was ein Quantizer macht helfen unsere Erklärungen vermutlich beide nicht *gig*)

  • Vllt noch das hier zur Erläuterung:

    Current CRF is constant quality as measured by one particular metric (not psnr or ssim or any of the normal metrics, but an ad-hoc one implicit in the CRF algorithm). It's similar bitrate on average as the same value of CQP, because I multiplied the CRF scale by a magic number to make that true, not by anything inherent in the algorithm.

    CRF+HaaliAQ is constant quality as measured by another metric. It's always at least a little higher bitrate per CRF value than plain CRF because HaaliAQ has a negative average QP bias, but that's just a UI tuning issue and could be fixed if desired.

    CRF+VAQ(static) is constant quality as measured by another metric. If you pick some random value of aq-sensitivity, it won't be equal on average, but will have some bias. We're trying to find a sensitivity value such that that bias averages to 0, thus it will hopefully be about the same bitrate on average as a given value of plain CRF if we do the tuning right (unless we choose to keep psy quality the same instead of bitrate).

    CRF+VAQ(auto) does the frame-wise bit allocation using the same metric as plain CRF, but reallocates bits within the frame using the VAQ metric.

    In short, there's no substantive difference between "improves smooth stuff at the cost of complex stuff" and "improves smooth stuff while keeping complex stuff the same". The only criterion AQ can be judged by is the relative distribution of quality. Any bias in the total quality is just a user interface issue separate from the algorithm.

  • Zeit aber auf jeden Fall, dass man die Werte die dort angegeben sind nicht direkt vergleichen kann. :D

    Wieso sollte der Vergleich nicht zulässig sein? Solange die Bitraten (Dateigrößen) und die restlichen Einstellungen beider Encodes identisch sind, ist ein visueller Vergleich sehr wohl zulässig. Natürlich sagt ein Einzelbild noch nicht sonderlich viel aus, aber ich kann dir versichern, dass der Eindruck bei der Wiedergabe genau so eindeutlig ist...

  • Ein weiteres Beispiel mit einer anderen Quelle. Die CRF bzw. CQP Werte wurden wieder so gewählt, dass die resultierenden Dateien nahezu gleich groß sind:
    * http://mplayer.somestuff.org/misc/CQP-vs-CRF.3.htm
    * http://mplayer.somestuff.org/misc/CQP-vs-CRF.4.htm

  • Zur Verdeutlichung (gemäß meinem - bei x264 etwas unvollständigem - Verständnis) :

    Wir sehen nicht den Unterschied "zwischen CQP und CRF". Was wir sehen ist (hauptsächlich) der Unterschied "ohne VAQ" <-> "mit VAQ".


    (Jaaa ... indirekt natürlich auch den Unterschied CQP<->CRF ... das liegt aber nicht am "rate-mode" als solchen, sondern eben nur daran, dass unter CQP kein VAQ stattfindet. Die VAQ Quantisierung ist's, die hier den großen Unterschied macht. Wenn CQP auch die VAQ benutzen würde, dann wäre vrmtl. kaum ein Unterschied zu sehen.

    ^ Längliche Version dessen, was Selur in #10 bereits gesagt hatte.)

  • Nun, es ging doch hier um die Frage, ob CQP oder CRF vorzuziehen ist. Daher sollte man die Modi doch so vergleichen, wie man sie in der Praxis tatsächlich einsetzen würde. Und das heißt nun mal, dass CRF sinnvollerweise mit aktiviertem VAQ benutzt wird (standard Wert). Dass die Unterschiede bei deaktiviertem VAQ weniger deutlich wären, das ist mir auch klar. Aber die Tatsache, dass CQP kein VAQ unterstützt ist, ist ja keine "künstlich" auferlegte Beschränkung, um CRF besser da stehen zu lassen, sondern resultiert unmittelbar aus der Funktionsweise von CQP. Die Quantizer sind bei CQP eben wirklich konstant. Also sehen wir hier sehr wohl den Unterschied zwischen "konstanten" und "adaptiven" Quantizern. So gesehen verfeinert VAQ lediglich das CRF-Prinzip von der Frame-Ebene auf die Makroblock-Ebene...

  • Ja, sicher. Aber sieh's mal anders herum: wenn man CRF verwendet, dann kann man VAQ auch deaktivieren. Und schwupps, sind sich beide Varianten gleich wieder sehr viel ähnlicher.
    Das VAQ inzwischen standardmäßig aktiviert ist und damit das (Default-) Ergebnis für CRF spricht, ist auch klar. Ich wollte eben nur verdeutlichen, das der CRF-Modus nicht aufgrund aus einem Grundprinzip heraus um solche Größenordnungen besser aussieht als CQP. Klar sieht das Endergebnis von CRF auch ohne VAQ ein bisschen besser aus, aber längst nicht so deutlich.

    Der ausschlaggebende Faktor bei Deinen Beispielen ist VAQ, und VAQ hat, grundsätzlich gesehen, nichts mit CRF zu tun.

    Man könnte ja auch einen Turbo-aufgeladenen Mercedes gegen einen nicht-aufgeladenen BMW antreten lassen, und dann folgern, dass Mercedes grundsätzlich mehr Power hat. Stimmt aber so so nicht, man kann auch einen Mercedes ohne Turbo kaufen ...

  • Der ausschlaggebende Faktor bei Deinen Beispielen ist VAQ, und VAQ hat, grundsätzlich gesehen, nichts mit CRF zu tun.

    Eben doch. Das Grundprinzip ist doch das selbe: Während "CRF ohne VAQ" die Quantizer nur auf Frame-Ebene anpasst und die Quantizer innerhalb eines Frames noch konstant sind, werden die Quantizer bei "CRF mit VAQ" jetzt auf Markoblock-Ebene angepasst. CRF bezieht VAQ mittlerweile sogar in seine Komplexitätsberechnung mit ein. Im Gegensatz dazu steht CQP, der grundsätzlich jeden Frame und jeden Macroblock mit dem selben Quantizer behandelt und niemals irgendeine "Anpassung" vornimmt....

    Man könnte ja auch einen Turbo-aufgeladenen Mercedes gegen einen nicht-aufgeladenen BMW antreten lassen, und dann folgern, dass Mercedes grundsätzlich mehr Power hat.

    Der Vergleich hinkt, da man ja beide Karren mit einem Turbo ausstatten könnte, dies aber absichtlich nicht getan wurde, um einem der beiden einen Vorteil zu verschaffen. Das ist hier aber gerade nicht der Fall! Die grundlegende Funktionsweise von CQP ist schlichtweg nicht mit VAQ zu vereinbaren, wohingegen CRF durch VAQ lediglich eine Stufe weiterentwickelt wird. Der Vergleich müsste also eher "Turbo-aufgeladener Mercedes gegen Fahrradfahrer" lauten, wobei der Fahrradfahrer nun mal leider keine Verwendung für einen Turbolader hätte.

    Und der Punkt ist doch:
    Wie "CRF ohne VAQ" gegen "CQP" abschneidet ist völlig irrelevant, da es keinen sinnvollen Grund gibt, so etwas heute zu verwenden.
    Relevant ist einzig und alleine der Vergleich "CRF mit VAQ" gegen "CQP", da dies die Einstellungen sind, die ein Benutzer tatsächlich verwenden würde.
    Wer noch überlegt, ob er CRF oder CQP verwenden soll, der wird wohl kaum auf die Idee kommen, einfach mal VAQ komplett zu deaktivieren...

Jetzt mitmachen!

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