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

29

Oft habe ich sameqzum Beispiel FFmpeg-Befehle mit der Option gesehen

ffmpeg -i input.mp4 -sameq output.avi

Was bedeutet das? Bedeutet das "gleiche Qualität"? Wenn nicht, was soll ich stattdessen verwenden?

slhck
quelle

Antworten:

57

sameq bedeutet nicht "gleiche Qualität"

Verschiedene Ressourcen im Web fördern die Verwendung der Option sameqoder same_quant, im Wesentlichen sind sie jedoch falsch. Bei Verwendung von erhalten sameqSie kein Ergebnis mit der gleichen Qualität wie bei der Eingabe.
Verwenden Sie es niemals.

Die Quelle der Verwirrung war eine schlecht geschriebene Dokumentation, aus der hervorgeht, dass die Verwendung dieser Option dieselbe Qualität bietet. Zum Glück wurde die Option entfernt.

In der FFmpeg-Dokumentation heißt es:

Beachten Sie, dass dies NICHT DIE GLEICHE QUALITÄT ist. Verwenden Sie diese Option nur, wenn Sie wissen, dass Sie sie benötigen.

In der Tat hatte der FFmpeg - Entwickler die Namen geändert von sameqauf same_quantnur um sicher zu machen, und dann entfernt sameq/same_quant insgesamt; Dies bedeutet, dass diese Option in neueren FFmpeg-Versionen nicht vorhanden ist. Dieser Artikel ist jedoch weiterhin nützlich für Benutzer älterer FFmpeg-Versionen.


Wie funktioniert die Videokomprimierung?

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

Um zu verstehen, warum es nicht zuverlässig funktioniert, müssen wir das Konzept verstehen, was "Qualität" für einen gemeinsamen 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 einen Konvertierungsverlust aus und warum ist das Video nach dem Kodieren kleiner als das Original?

Wenn Sie Video codieren, werden Ihre Eingabedaten in eine andere Dimension konvertiert, indem zunächst eine mathematische Transformation auf Pixelblöcke angewendet wird. Diese Transformation, meistens eine diskrete Kosinustransformation , erzeugt eine Zahlenmatrix, die beispielsweise ein Feld von 8 × 8 Pixeln im Video beschreibt.

Ihre 8 × 8 Pixel und die entsprechende Matrix sehen also zunächst so aus: 1

Original Bild  

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

Um die Zahlen unten rechts zu entfernen, können wir sie zu Nullen machen. Wenn etwas "nichts" ist oder sich nur als 0s wiederholt , müssen wir es nicht speichern, und auf diese Weise sparen wir Platz. Mathematisch müssen wir diese erste Matrix quantisieren, indem wir eine andere Matrix anwenden, eine "Quantisierungsmatrix".

Dies wird zu einer Matrix führen, die jetzt wesentlich weniger Zahlen und viele Nullen enthält:

Komprimiertes Bild  

Das Ergebnis ist, dass wir die erste Matrix mit hoher Qualität und vielen Zahlen in eine Matrix verwandelt haben, die immer noch den gleichen 8 × 8 Pixeln ähnelt, aber mit einer geringeren Qualität, da sie weniger Zahlen zur Beschreibung dieser Pixel enthält. Wenn Sie den Block visuell vergleichen, sind sie ähnlich, aber nicht mehr ganz gleich.

Hier bestimmt die Quantisierungsmatrix 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, desto schlechter wird die Qualität, aber desto mehr können wir das Video komprimieren, da wir hier im Grunde die Nullen "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 erfahren haben, führen unterschiedliche Quantisierungsmatrizen zu unterschiedlicher Qualität. Wenn wir unseren Encoder also anweisen, die Qualität zu verwenden x, wählt er die geeignete Quantisierungsmatrix aus y, um diese Qualität zu erhalten, unabhängig davon, um welche Qualität es sich handelt. Das Ergebnis ist ein Video, das mithilfe der yMatrix komprimiert wurde . 2

Und hier ist der interessante Teil: sameqbedeutet "gleicher Quantisierer". Nicht "gleiche Qualität". Wenn Sie eine nicht aktuelle Version von FFmpeg haben, finden Sie diese immer noch in ffmpeg --help:

ffmpeg --help 2>&1 | grep sameq

Wenn Sie nun das konvertierte Video aufnehmen und erneut codieren und die sameqOption anwenden , wählt FFmpeg einfach die gleichen Quantisierungsmatrizen aus, die für das Eingangsvideo verwendet wurden.

Dies funktioniert in gewisser Weise, wenn Sie für die Ein- und Ausgabe genau denselben Codec verwenden, z. B. beim Konvertieren von einem XviD-Video in ein XviD-Video, die Qualität jedoch immer noch schlechter ist. 3 Dies ist darauf zurückzuführen, dass durch das Codieren von bereits codierten Elementen noch mehr Informationen verloren gehen. Im obigen Beispiel erstellen wir noch mehr Nullen in unserer Matrix und das Ergebnis sieht schlechter aus.

Es funktioniert überhaupt nicht 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 die gleichen Koeffizienten. Also macht diese Option nicht einmal Sinn! Leider können Sie FFmpeg weiterhin verwenden.

Fazit: Verwenden Sie diese Option nur, wenn Sie genau wissen, was Sie tun. Wenn Sie Ihr Video mit einem anderen Codec codieren möchten, 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 stellen Sie andernfalls eine höhere Qualität ein. Das ist ungefähr so ​​viel, wie Sie tun können.

Wenn Sie wissen möchten, wie Sie Ihre Qualität beim Neukodieren erhalten können, lesen Sie die folgenden Beiträge:


1) Die Matrix entspricht hier nicht wirklich dem Bild. Dies ist nur ein Beispiel.
2) Heutzutage verwenden die meisten Codierungsprozesse nicht nur eine Matrix. Wenn Sie eine bestimmte Bitrate einstellen, verwendet der Encoder verschiedene Matrizen, um eine durchschnittliche Bitrate pro Sekunde zu erhalten. Ebenso setzen moderne Encoder bei der Einstellung einer bestimmten Qualität je nach Inhalt unterschiedliche Matrizen ein. Dies liegt daran, dass einige Inhalte "einfacher" zu komprimieren sind als andere und weniger Quantisierung erfordern, um den gleichen 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.

slhck
quelle
-sameqOption wurde veraltet und dann von avconv entfernt
AzizSM