Nicht alle Encoder sind gleich

Nicht alle Encoder sind gleich

Ich habe einen mp4-Film von 1:15min Länge, der mit der Sony Alpha 6400 4k Kamera gemacht wurde. Er hat eine Größe von 528MB. Ich möchte ihn mit schneiden ffmpeg. Obwohl ich nur ein paar Sekunden geschnitten habe, war das neue Videovielkleiner. Ich habe also einige Tests mit der ungeschnittenen Originaldatei durchgeführt und festgestellt, dass die Verarbeitung selbst ohne Optionen viel kleinere Dateien erzeugt:

 ffmpeg -i C0034.MP4 C0034_ffmpeg.MP4

Die Ausgabedatei C0034_ffmpeg.MP4benötigt nur 102 MB Speicherplatz. Das ist etwa 1/5 der Eingabedatei.ohneAnwenden aller Optionen, die die Dateigröße verringern könnten, wie etwa weniger Bilder pro Sekunde, eine geringere Auflösung und andere Dinge.

Die Voreinstellungen

Entsprechenddie Dokumentation:

Eine Voreinstellung ist eine Sammlung von Optionen, die ein bestimmtes Verhältnis von Kodierungsgeschwindigkeit zu Komprimierung bereitstellen.

Für mein Verständnis ist das vergleichbar mitder -mx=XWechsel von 7zip: Ein höherer Komprimierungsgrad bedeutet kleinere Dateien. Es dauert länger, aber die Qualität der Datei bleibt davon unberührt.

Die Standardeinstellung von ffmpeg ist mittel. Ich habe sie auf geändert veryslowund eine 83,4 MB große Datei erhalten, während dieselbe Datei 149 MB in Anspruch nahm ultrafast. Dies ist ein deutlicher Unterschied von etwa 66 MB zwischen der stärksten und der niedrigsten Komprimierung. Aber selbst ultrafastist immer noch 379 MB kleiner als die Roheingabedatei, sodass die Standardvorgabe den mediumgrößten Teil des Unterschieds nicht zu erklären scheint.

DerKonstanter Ratenfaktor(CRF)

Dergleicher H264-Artikel von ffmpegzeigt das CRF. Laut Dokumentationist für die meisten Anwendungen der empfohlene Ratensteuerungsmodus.Es scheint ein Faktor zu sein, der für ffmpeg verwendet wird, um die Qualität und Dateigröße zu bestimmen.

Der Bereich der CRF-Skala reicht von 0 bis 51, wobei 0 verlustfrei, 23 die Standardeinstellung und 51 die schlechteste mögliche Qualität bedeutet.

Da 23 als Standard verwendet wird, erhalten wir technisch gesehen keine verlustfreie Ausgabedatei. Aber es erklärt auch, warum diese Ausgabedateien nicht schlechter aussehen als die Eingabedateien, obwohl sie viel kleiner sind:

Betrachten Sie 17 oder 18 als optisch verlustfrei oder nahezu verlustfrei. Es sollte gleich oder nahezu gleich wie die Eingabe aussehen, ist aber technisch gesehen nicht verlustfrei.

Beim Herumspielen scheint es, dass CRF die Dateigröße viel stärker beeinflusst als die Voreinstellungen (was offensichtlich ist, da Voreinstellungen nur die Komprimierung und CRF die Qualität handhaben). Ich habe einige Kombinationen ohne Voreinstellungen ausprobiert (also wird die Standardeinstellung verwendet):

  • -crf 23~> 102 MB (Standard)
  • -crf 20~> 189 MB
  • -crf 18~> 285 MB
  • -crf 17~> 347 MB
  • -crf 0~> 2,64 GB

Nach den ersten Tests ging ich davon aus, den Grund dafür herausgefunden zu haben: CRF hat einen enormen Einfluss auf die Dateigröße, auch wenn zwischen 23 und 17 kein sichtbarer Unterschied feststellbar ist (zumindest nicht für mich).

ABER ich habe mich wirklich gefragt, wie -crf 0(was verlustfrei bedeutet) fast 5-mal größer ist als die ursprüngliche Eingabedatei? Aufgrund des großen Unterschieds habe ich vermutet, dass die Ausgabedatei eine bessere Qualität hat als die Eingabedatei. Wie ist das möglich? Was tut man, ffmpegum die Ausgabedatei so groß zu machen?

Antwort1

Nicht alle Encoder sind gleich

x264 ist ein hocheffizienter H.264-Encoder, was bedeutet, dass er bei niedrigeren Bitraten eine hohe Qualität ausgeben kann. x264 verwendet raffinierte „psychovisuelle“ Tricks, um das Auge zu täuschen und Bits zu sparen, die bei weniger effizienten Encodern möglicherweise fehlen.

H.264-Encoder auf Kameras und Telefonen müssen aufgrund anderer Prioritäten (weniger Ressourcen, erforderliche Mindestcodierungsgeschwindigkeit, Akkulaufzeit usw.) mehr Kompromisse eingehen. Obwohl sie also dasselbe Format erstellen, können sie höchst ineffizient sein, was bedeutet, dass sie bei derselben Bitrate nicht mit x264 mithalten können.

Die Standardeinstellungen für x264 sind gut, sodass der durchschnittliche Benutzer oft keinen Qualitätsunterschied bemerkt, obwohl die Dateigröße möglicherweise erheblich reduziert ist.

Verlustfrei ist riesig

Die Einstellung -crf 0verwendet einen speziellen komprimierten verlustfreien Modus. Die meisten Tricks zur Reduzierung der Dateigröße können im verlustfreien Modus nicht verwendet werden.

Die Größe der Eingabedatei sollte bei verlustfreier Verarbeitung nicht berücksichtigt werden. Die Eingabe wird vollständig in unkomprimiertes Rohvideo dekodiert: die grundlegenden Bausteine ​​eines Videos. Rohvideo ist verlustfrei, hat aber die größte Dateigröße von allen, da es nicht komprimiert ist. Der verlustfreie Encoder nimmt dann das Rohvideo und kann es etwas komprimieren, aber dennoch verlustfrei halten. Wie ZIP, aber für Video konzipiert. Kleiner als Rohvideo, aber nicht so klein wie Ihr typisches verlustbehaftetes H.264, da es nicht alle tollen Tricks nutzen kann. Andernfalls wäre es nicht mehr verlustfrei.

Es ist nicht möglich, eine Ausgabe zu erstellen, die eine bessere Qualität als die Eingabe hat. Die Qualität kann nur geringer oder gleich sein. Unabhängig von Format oder Encoder.

verwandte Informationen