Wie konvertiert man eine mp4
-Datei am besten in webm
ohne Qualitätsverlust (unter Verwendung von vp8
oder vp9
) mit ffmpeg?
Wenn ich ffmpeg -i in.mp4 out.webm
mache, ist die Qualität sehr schlecht. Ich kann eine Zielbitrate über -b:v
und einen Modus mit konstanter Qualität über crf
angeben, dh
ffmpeg -i in.mp4 -crf 10 -b:v 1M out.webm
Dies ergibt eine bessere Qualität. Dafür muss ich jedoch die Bitrate des Eingangsvideos nachschlagen (hier 1M).
Mir ist auch aufgefallen, dass ffmpeg nur dann scheint, wenn Sie einen viel größeren Wert für die Zielbitrate als die Bitrate der Eingabe angeben (hier zum Beispiel -b:v 100M
) Verwenden Sie ungefähr die Bitrate aus dem Eingangsvideo mit vp9 oder eine etwas höhere Bitrate mit vp8. Diese Lösung scheint jedoch nicht die beabsichtigte Methode zu sein.
Wie würden Sie den crf-Wert auswählen und warum?
Gibt es einen Parameter, der automatisch die Bitrate von auswählt die Eingabedatei und einen geeigneten crf-Wert, um die gleiche Qualität wie die Eingabedatei zu erhalten?
Kommentare
- Setzen Sie die Bitrate auf 0. Und experimentieren Sie mit crf Aber Ihre Methode mit hoher Bitrate funktioniert auch, da der Wert als Obergrenze und nicht als Ziel fungiert.
- @Mulvya: Bedeutet Bitrate 0, dass es keine Begrenzung gibt? Ich habe nicht ' finden Sie dies nicht in der Manpage.
- Wenn die Bitrate nicht auf Null gesetzt ist, wird CRF durch diesen Wert eingeschränkt. Bei Null ist es ' s nicht. Es ' ist eine Eigenart der VPn-Encoder.
- Ok, aber wenn ich den Bitratenparameter komplett weglasse, wird die Qualität sehr schlecht, obwohl ich es nicht getan habe div id = „b75c8193b8″>
gibt keine Obergrenze für die Bitrate an.
Antwort
Answer
Verwenden Sie den Zwei-Pass-Modus für konstante Qualität: ¹
ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 1 -an -f webm /dev/null ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 2 output.webm
Erläuterung:
Wenn Sie die Videobitrate auf Null setzen und gleichzeitig den CRF (Constant Rate Factor) angeben, wird der Modus Constant Quality aktiviert, der auf ein bestimmtes Wahrnehmungsqualitätsniveau abzielt. Bei VP9 kann die CRF zwischen 0 (beste Qualität) und 63 (kleinste Dateigröße) liegen.
Es ist wichtig, die Videobitrate auf Null zu setzen. Wenn Sie keine Video-Bitrate angeben, wird standardmäßig eine niedrige Bitrate verwendet, wodurch Sie den eingeschränkten Qualitätsmodus erhalten, in dem jeder Frame eine maximale Bitrate aufweist. Dies kann zwar für das Streaming nützlich sein, verringert jedoch die Qualität erheblich, da Frames mit viel Bewegung nicht über die Bandbreite verfügen, die für ein gutes Aussehen erforderlich ist.
Ein weiterer Grund für den Qualitätsverlust ist, dass webm
(VP9) bevorzugt die Codierung in zwei Durchgängen, um die besten Ergebnisse zu erzielen. Der erste Durchgang erstellt Statistiken über das Video, die dann im zweiten Durchgang verwendet werden, um ein Video mit kleinerer und höherer Qualität zu erstellen.
Weitere Informationen finden Sie in der Dokumentation zu ffmpeg VP9 wenn Sie mehr erfahren möchten.
Ein Wort zum Transcodieren
Übrigens im Allgemeinen Transcodieren von Formaten (Aufnehmen eines komprimierten Videos und erneutes Komprimieren mit a anderer Codec) ist eine schlechte Idee, da Sie nicht nur die normalen Fehler aus der verlustbehafteten Videokodierung hinzufügen, sondern auch Bits im neuen Format verschwenden, um die Artefakte aus dem alten zu erhalten.
Wenn Sie bedeutet wörtlich „ohne Qualitätsverlust“
Die Option -lossless 1
des VP9-Encoders von ffmpeg ermöglicht den verlustfreien Qualitätsmodus, jedoch mit einer potenziell enormen Zunahme der Dateigröße.
Alles, was Sie brauchen, ist Folgendes:
ffmpeg -i input.mp4 -lossless 1 output.webm
Als ich -lossless 1
auf einem mp4
, die resultierende webm
war 100 × größer, was nicht a war für mich akzeptabel. Wenn Ihre mp4
-Dateien jedoch bereits eine sehr hohe Qualität aufweisen, wird der Größenunterschied voraussichtlich nicht so groß sein.
Fußnote 1: Wenn Sie Wenn Sie Microsoft Windows anstelle von UNIX verwenden, ändern Sie /dev/null
in NUL
.
Kommentare
- Großartige Antwort danke
-
/dev/null
? Was bedeutet das? Was wäre das Äquivalent für Windows-Benutzer? Überschreiben Sieinput.mp4
beim ersten Durchgang? Diese Antwort muss näher erläutert werden, was genau jede Komponente tut. ' bietet Zwischenbenutzern nicht viele Erklärungen Wie es funktioniert. - Hallo Hassfreund: Meine Antwort enthält bereits einen langen Erklärungsabschnitt sowie einen Link für weitere Informationen, sodass ich ' es lieber nicht länger machen möchte. Haben Sie die Fußnote zu Microsoft Windows gesehen, die Ihre spezielle Frage beantwortet? Wie oben erwähnt, auch die Compi für den ersten Durchgang les Statistiken über die Eingabedatei.Es besteht kein Grund zur Befürchtung, dass die Eingabe überschrieben werden könnte.
- Ich habe versucht, die .MTS-Datei mithilfe dieser beiden Befehle in .webm zu konvertieren (Ubuntu 20.10, ffmpeg Version 4.2.2). Ich habe jedoch folgende Fehler: " Ungültiges Kanallayout 5.1 (Seite) für die angegebene Zuordnungsfamilie -1. Fehler beim Initialisieren des Ausgabestreams 0: 1 – Fehler beim Öffnen des Encoders für den Ausgabestream # 0: 1 – Möglicherweise falsche Parameter wie Bitrate, Rate, Breite oder Höhe "
anke für die Antwort. Wenn Transcodierung im Allgemeinen eine schlechte Idee ist, was empfehlen Sie stattdessen, wenn Sie MP4-Videos in WebM und WebM-Videos in MP4 konvertieren müssen?
Antwort
Unter Linux verwende ich optimizeVideo , einen Wrapper um ffmpeg, der diese Einstellungen automatisch gemäß Empfehlungen von Google .
Das Ergebnis ist ein Video, dessen Qualitätsunterschied Sie nicht erkennen können, das jedoch normalerweise um Größenordnungen kleiner ist.