Was ist die Option „sameq“ oder „same_quant“ in FFmpeg? Bedeutet sie „gleiche Qualität“?

Was ist die Option „sameq“ oder „same_quant“ in FFmpeg? Bedeutet sie „gleiche Qualität“?

Oft habe ich FFmpeg-Befehle gesehen, die diese sameqOption verwenden, zum Beispiel

ffmpeg -i input.mp4 -sameq output.avi

Was bedeutet das? Bedeutet es „gleiche Qualität“? Wenn nicht, was sollte ich stattdessen verwenden?

Antwort1

sameqbedeutet nicht "gleiche Qualität"

Mehrere Ressourcen im Web empfehlen die Verwendung der Option sameq„oder“ same_quant, aber im Grunde sind sie falsch. Die Verwendung von „oder“ sameqführt nicht zu einem Ergebnis mit der gleichen Qualität wie die Eingabe.
Benutzen Sie es auf keinen Fall.

Die Ursache der Verwirrung war eine schlecht geschriebene Dokumentation, die suggerierte, dass die Verwendung dieser Option die gleiche Qualität liefert. Glücklicherweise wurde diese Option entfernt.

Hier ist was die FFmpeg-Dokumentationsagte:

Beachten Sie, dass dies NICHT DIE GLEICHE QUALITÄT ist. Verwenden Sie diese Option nicht, es sei denn, Sie wissen, dass Sie sie benötigen.

Tatsächlich hatten die FFmpeg-Entwicklerden Namen geändertvon sameqbis same_quantnur um sicherzugehen, und dannENTFERNT sameq/same_quantinsgesamt; das bedeutet, dass diese Option in neueren FFmpeg-Versionen nicht vorhanden ist, dieser Artikel aber dennoch für Benutzer älterer FFmpeg-Builds nützlich ist.


Wie funktioniert Videokomprimierung?

Nachdem wir dies geklärt haben, gehen wir nun auf einige technische Details ein.

Um zu verstehen, warum es nicht zuverlässig funktioniert, müssen wir verstehen, was „Qualität“ für einen gängigen Video-Encoder bedeutet und was die Qualität beeinflusst. Warum sieht ein Video besser aus als das andere, wenn es mit unterschiedlichen Bitraten komprimiert wird? Was macht eine Konvertierung verlustbehaftet und warum ist das Video nach der Kodierung kleiner als das Original?

Wenn Sie ein Video kodieren, werden Ihre Eingabedaten in eine andere Dimension umgewandelt, indem zunächst eine mathematische Transformation auf Pixelblöcke angewendet wird. Diese Transformation, meist eineDiskrete Cosinus-Transformation, erzeugt eine Zahlenmatrix, die beispielsweise ein Feld von 8×8 Pixeln im Video beschreibt.

Ihre 8×8 Pixel und die entsprechende Matrix würden also zunächst so aussehen: 1

Original Bild  

Aber das sind zu viele Daten! Wenn wir das Video komprimieren möchten, können wir die Zahlen unten rechts tatsächlich entfernen. Ich werde nicht genau erklären, warum das so ist, aber sagen wir einfach, dass die Zahlen oben links bei der Beschreibung eines solchen Blocks wichtiger sind. Die ganze Idee der Transformation besteht im Grunde darin, die wichtigen Dinge oben links zu platzieren.

Um die Zahlen unten rechts zu entfernen, können wir sie zu Nullen machen. Wenn etwas „nichts“ ist oder sich einfach als 0s wiederholt, müssen wir es nicht speichern und sparen so Platz. Mathematisch gesehen müssen wirquantisierendiese erste Matrix durch Anwendung einer anderen Matrix, einer „Quantisierungsmatrix“.

Das Ergebnis ist eine Matrix, die nun erheblich weniger Zahlen und viele Nullen enthält:

Komprimiertes Bild  

Das Ergebnis ist, dass wir die erste, qualitativ hochwertige Matrix mit vielen Zahlen in eine Matrix umgewandelt haben, die zwar immer noch den gleichen 8×8 Pixeln ähnelt, aber eine geringere Qualität aufweist, da sie weniger Zahlen zur Beschreibung dieser Pixel hat. Wenn Sie den Block visuell vergleichen, sind sie ähnlich, aber nicht mehr ganz gleich.

Hier,die Quantisierungsmatrix bestimmt die Qualität. Das ist wichtig. Wir können verschiedene Quantisierungsmatrizen für unterschiedliche Qualität verwenden. Einige Quantisierungsmatrizen lassen die ursprüngliche Matrix fast intakt, andere nicht. Je mehr Zahlen wir entfernen, destoschlechterdie Qualität wird, aber diemehrwir können das Video komprimieren, da wir die Nullen hier grundsätzlich „wegwerfen“ können.

Was hat das damit zu tun sameq?

Nehmen wir an, Sie kodieren ein Video und möchten eine bestimmte Qualität einstellen. Wie wir bereits gelernt haben, führen unterschiedliche Quantisierungsmatrizen zu unterschiedlicher Qualität. Wenn wir also unserem Encoder sagen, er solle Qualität verwenden x, wählt er die entsprechende Quantisierungsmatrix aus, yum diese Qualität zu erreichen, egal, wie hoch sie ist. Das Ergebnis ist ein Video, das mit der yMatrix komprimiert wurde. 2

Und hier ist der interessante Teil:sameqbedeutet "derselbe Quantisierer". Nicht "dieselbe Qualität".Wenn Sie eine ältere Version von FFmpeg haben, finden Sie sie immer noch hier ffmpeg --help:

ffmpeg --help 2>&1 | grep sameq

Wenn Sie jetzt das konvertierte Video nehmen und es erneut kodieren und die Option anwenden sameq, wählt FFmpeg, vereinfacht gesagt, dieselben Quantisierungsmatrizen aus, die für das Eingabevideo verwendet wurden.

Dasetwasfunktioniert, wenn Sie für Eingabe und Ausgabe genau denselben Codec verwenden, z. B. bei der Konvertierung von einem XviD-Video in ein XviD-Video, aber die Qualität wird trotzdem schlechter. 3 Das liegt daran, dass beim Kodieren von etwas, das bereits kodiert ist, noch mehr Informationen verloren gehen. Im obigen Beispiel erzeugen wir noch mehr Nullen in unserer Matrix und das Ergebnis wird schlechter aussehen.

Es tutnichtfunktioniert überhaupt mit verschiedenen Video-Codecs. Angenommen, Sie konvertieren ein XviD-codiertes Video mit x264.4 Für diese beiden Codecs sind die intern verwendeten Quantisierungsmatrizen unterschiedlich – sie haben nicht dieselben Koeffizienten. Daher ergibt diese Option nicht einmal Sinn! Leider können Sie sie in FFmpeg trotzdem verwenden.

Fazit: Bitte verwenden Sie diese Option nicht, es sei denn, Sie wissen genau, was Sie tun. Wenn Sie Ihr Video mit einem anderen Codec kodieren, aber die Qualität beibehalten möchten, müssen Sie experimentieren und die Qualität einfach selbst einstellen. Prüfen Sie, ob das Ergebnis zufriedenstellend ist, und wenn nicht, stellen Sie eine höhere Qualität ein. Das ist ungefähr alles, was Sie tun können.

Wenn Sie abschließend nachlesen möchten, wie Sie beim Neukodieren die Qualität beibehalten können, sehen Sie sich diese Beiträge an:


1) Die Matrix entspricht hier nicht wirklich dem Bild. Dies ist nur ein Beispiel.
2) Tatsächlich verwenden die meisten Kodierungsprozesse heutzutage nicht nureinsMatrix. Wenn Sie eine bestimmte Bitrate einstellen, verwendet der Encoder verschiedene Matrizen, um eine durchschnittliche Bitrate pro Sekunde zu erhalten. Ebenso verwenden moderne Encoder beim Einstellen einer bestimmten Qualität je nach Inhalt unterschiedliche Matrizen. Dies liegt daran, dass einige Inhalte „einfacher“ zu komprimieren sind als andere und weniger Quantisierung erfordern, um denselben Komprimierungsfaktor zu erhalten.
3) Beispiel: ffmpeg -i input.avi -sameq -c:v libxvid output.avi. Verwenden Sie dies nicht. Bitte.
4) Beispiel: ffmpeg -i input.avi -sameq -c:v libx264 output.mp4. Verwenden Sie dies auch nicht. Ich meine es ernst.

verwandte Informationen