Ich versuche, meine Videobibliothek in das HEVC-Format zu konvertieren, um Speicherplatz zu gewinnen. Ich habe den folgenden Befehl für alle Videodateien in meiner Bibliothek ausgeführt:
#!/bin/bash for i in *.mp4; do #Output new files by prepending "X265" to the names avconv -i "$i" -c:v libx265 -c:a copy X265_"$i" done
Jetzt konvertieren die meisten Videos einwandfrei und die Qualität ist dieselbe wie zuvor. Einige Videos von sehr hoher Qualität (z. B. ein Filmdruck mit 5 GB) verlieren jedoch an Qualität – das Video ist vollständig pixelig.
Ich bin mir nicht sicher, was ich in diesem Fall tun soll. Muss ich den Parameter crf
in meiner Befehlszeile ändern? Oder etwas anderes?
Die Sache ist, ich mache eine Massenkonvertierung. Ich benötige also eine Methode, bei der avconv
automatisch die Parameter anpasst, die für jedes Video angepasst werden müssen.
UPDATE-1
Das habe ich gefunden crf
ist der Knopf, den ich einstellen muss. Die Standard-CRF ist 28. Für eine bessere Qualität könnte ich weniger als 28 verwenden. Beispiel:
avconv -i input.mp4 -c:v libx265 -x265-params crf=23 -c:a copy output.mp4
Das Problem ist jedoch, dass für einige Videos CRF Der Wert 28 ist gut genug, während für einige Videos eine niedrigere CRF erforderlich ist. Dies muss ich manuell überprüfen, indem ich kleine Abschnitte der großen Videos konvertiere. Wie würde ich bei der Massenkonvertierung jedes Video manuell überprüfen? Ist es eine Möglichkeit, dass avconv
CRF entsprechend dem Eingangsvideo intelligent anpassen kann?
UPDATE-2
Ich habe festgestellt, dass es eine gibt --lossless
Option in x265: http://x265.readthedocs.org/en/default/lossless.html .
Ich weiß jedoch nicht, wie ich es richtig verwenden soll. Ich habe versucht, es auf folgende Weise zu verwenden, aber es ergab entgegengesetzte Ergebnisse (das Video war noch pixeliger):
avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4
Kommentare
-
--lossless
kann die Datei tatsächlich vergrößern, wenn der zuvor verlustbehaftete Codec dekodiert wird und dann gibt an, was verlustfrei dekodiert wurde. Die Qualität bleibt genauso wie die Eingabe. - Wenn Ihre Quellen verlustbehaftet codiert sind (was höchstwahrscheinlich der Fall ist), ist das, was Sie erreichen möchten, unmöglich Wenn Sie nicht verlustfrei sind, wird die Qualität weiter beeinträchtigt (auch wenn Sie nicht sofort sichtbar sind). Wenn Sie von verlustbehaftet zu verlustfrei konvertieren, erhalten Sie größere Dateien .
Antwort
Wenn Sie aus eigener Erfahrung absolut keinen Qualitätsverlust wünschen, ist –lossless was Sie suchen.
Sie sind sich nicht sicher über avconv
, aber der von Ihnen eingegebene Befehl sieht identisch aus mit dem, was ich mit FFmpeg
. In FFmpeg
können Sie den Parameter wie folgt übergeben:
ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv
Die meisten x265
-Schalter (Optionen ohne Wert) können wie folgt angegeben werden (mit Ausnahme der Nur-CLI-Schalter, die nur direkt mit der x265
-Binärdatei verwendet werden).
Damit möchte ich meine Erfahrungen mit der x265
-Codierung teilen. Für die meisten Videos (sei es WMV, MPEG oder AVC) /H.264) Ich verwende crf=23
. x265
entscheidet über den Rest der Parameter und macht normalerweise einen ausreichend guten Job. P. >
Bevor ich mich jedoch dazu verpflichte, ein Video vollständig zu transkodieren, teste ich meine Einstellungen, indem ich einen kleinen Teil des betreffenden Videos konvertiere. Hier ein Beispiel: Angenommen, eine MKV-Datei mit Stream 0 ist Video, Stream 1 Da es sich um DTS-Audio handelt und Stream 2 ein Untertitel ist:
ffmpeg -hide_banner \ -ss 0 \ -i "INPUT.mkv" \ -attach "COVER.jpg" \ -map_metadata 0 \ -map_chapters 0 \ -metadata title="TITLE" \ -map 0:0 -metadata:s:v:0 language=eng \ -map 0:1 -metadata:s:a:0 language=eng -metadata:s:a:0 title="Surround 5.1 (DTS)" \ -map 0:2 -metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \ -metadata:s:t:0 filename="Cover.jpg" -metadata:s:t:0 mimetype="image/jpeg" \ -c:v libx265 -preset ultrafast -x265-params \ crf=22:qcomp=0.8:aq-mode=1:aq_strength=1.0:qg-size=16:psy-rd=0.7:psy-rdoq=5.0:rdoq-level=1:merange=44 \ -c:a copy \ -c:s copy \ -t 120 \ "OUTPUT.HEVC.DTS.Sample.mkv"
Beachten Sie, dass die Backslashes-Signalleitung in einem langen Befehl unterbrochen wird. Ich tue dies, um den Überblick zu behalten von verschiedenen Bits eines komplexen CLI-Eingangs. Bevor ich es Zeile für Zeile erkläre, ist der Teil, in dem Sie nur einen kleinen Teil eines Videos konvertieren, die zweite Zeile und die vorletzte Zeile: -ss 0
bedeutet, dass Sie 0 Sekunden vorher suchen Startet die Dekodierung der Eingabe und -t 120
bedeutet, dass das Schreiben in die Ausgabe nach 120 Sekunden beendet wird. Sie können auch die Zeitformate hh: mm: ss oder hh: mm: ss.sss verwenden.
Jetzt Zeile für Zeile:
-
-hide_banner
verhindert, dassFFmpeg
beim Start Build-Informationen anzeigt. Ich möchte es nur nicht sehen, wenn ich in der Konsole nach oben scrolle. -
-ss 0
sucht nach 0 Sekunden, bevor mit der Dekodierung der Eingabe begonnen wird. Beachten Sie, dass dieser Parameter angezeigt wird Wird nach der Eingabedatei und vor der Ausgabedatei angegeben, wird es zu einer Ausgabeoption und teiltffmpeg
, um die Eingabe bis zu x Sekunden zu dekodieren und zu ignorieren und dann mit dem Schreiben in die Ausgabe zu beginnen. Als Eingabeoption ist sie weniger genau (da die Suche in den meisten Containerformaten nicht genau ist), dauert jedoch fast keine Zeit.Als Ausgabeoption ist es sehr präzise, benötigt jedoch viel Zeit, um den gesamten Stream vor der angegebenen Zeit zu dekodieren. Zu Testzwecken möchten Sie keine Zeit verschwenden. -
-i "INPUT.mkv"
: Geben Sie die Eingabedatei an; -
-attach "COVER.jpg"
: Fügen Sie der Ausgabe ein Titelbild (Miniaturbild, Poster, was auch immer) hinzu Cover Art wird normalerweise in Datei-Explorern angezeigt; -
-map_metadata 0
: Kopieren Sie alle Metadaten von Eingabe 0, die im Beispiel nur die Eingabe ist. -
-map_chapters 0
: Kopieren Sie die Kapitelinformationen (falls vorhanden) von Eingabe 0; -
-metadata title="TITLE"
: Legen Sie den Titel des Videos fest: -
-map 0:0 ...
: Ordnen Sie Stream 0 von Eingang 0 zu. Dies bedeutet, dass der erste Stream von der Eingabe in die Ausgabe geschrieben werden soll Da es sich bei diesem Stream um einen Videostream handelt, handelt es sich um den ersten Video -Stream in der Ausgabe , daher der Stream-Spezifizierer:s:v:0
. Stellen Sie die Sprache ein Tag auf Englisch; -
-map 0:1 ...
: Ordnen Sie ähnlich wie in Zeile 8 den zweiten Stream (DTS-Audio) zu und legen Sie dessen Sprache und Titel fest (zur leichteren Identifizierung bei der Auswahl von Spielern); -
-map 0:2 ...
: Ähnlich wie Zeile 9, außer dass dieser Stream ein Untertitel ist; -
-metadata:s:t:0 ...
: Legen Sie Metadaten für das Cover fest. Dies ist für das mkv-Containerformat erforderlich: -
-c:v libx265 ...
: Video-Codec-Optionen. Es ist so lang, dass ich es in zwei Zeilen aufgeteilt habe. Diese Einstellung eignet sich für hochqualitative Unschärfevideos (1080p) mit minimalen Streifen im Farbverlauf (an denen x265 saugt). Es ist höchstwahrscheinlich ein Overkill für DVDs, TV-Shows und Telefonvideos. Diese Einstellung wird meistens aus diesem Doom9-Beitrag gestohlen ; -
crf=22:...
: Fortsetzung des Videocodecs Parameter. Siehe den oben erwähnten Forumsbeitrag; -
-c:a copy
: Über Audio kopieren; -
-c:s copy
: Über Untertitel kopieren; -
-t 120
: Beenden Sie das Schreiben in die Ausgabe nach 120 Sekunden, wodurch wir einen 2-minütigen Clip für die Vorschau der Trancodierungsqualität erhalten. -
"OUTPUT.HEVC.DTS.Sample.mkv"
: Name der Ausgabedatei. Ich markiere meine Dateinamen mit dem Video-Codec und dem primären Audio-Codec.
Puh. Dies ist meine erste Antwort. Wenn ich etwas verpasst habe, hinterlasse bitte einen Kommentar. Ich bin kein Experte für Videoproduktion, ich bin nur ein Typ, der zu faul ist, um einen Film anzusehen, indem er die CD in den Player legt.
PS. Vielleicht gehört diese Frage woanders hin ist nicht stark mit Unix & Linux verwandt.
Kommentare
- Genau das, wonach ich gesucht habe ! Gute Abdeckung der Optionen. Wissen Sie, ob ffmpeg
c:s copy
blockiert, wenn kein Untertitelinhalt vorhanden ist? - @ElderGeek Nein, ffmpeg sagt nur etwas, wenn diese Option Auswirkungen hat.
- @TheBitByte Ja und nein, denke ich. Sie möchten ‚ keine verlustfreien h265-Dateien. ‚ ist nur ein roher Bitstrom ohne jegliche Komprimierung. Es ist ‚ riesig. Soweit ich über die Implementierung von h265 oder speziell x265 weiß, handelt es sich nicht um eine verlustfreie Komprimierungsmethode. Jeder Grad der Komprimierung führt zum Verlust von Informationen, jedoch nicht unbedingt zum Verlust der Anzeigequalität. Aber ich ‚ bin kein Experte für h265-Themen, daher ist es ‚ möglich, dass ich etwas verpasst habe
- @ TheBitByte ‚ glaube nicht, dass es in h265 eine verlustfreie Komprimierungsstufe gibt. Bei der Option ohne Komprimierung ist ‚ nur
--lossless
. Ich habe vergeblich nach einer verlustfreien Konvertierung von h264 nach h265 gesucht, und was ich ‚ gelernt habe, sagt mir, dass ‚ mathematisch unmöglich ist. - Sie sollten den Befehl mit dem
--lossless
-Schalter aus dieser Antwort heraus wirklich bearbeiten, da es als Antwort auf diese Frage so klingt, als ob Sie ‚ sagt, dass ‚ verlustfreie Komprimierung ist, was irreführend ist.
Antwort
Ich habe kürzlich die Mühe gemacht, meinen gesamten Videokatalog auf HEVC zu übertragen. Ich verwende mit den folgenden Einstellungen.
h265ize -v -m mittel -q 20 -x –no-sao – -aq-mode 3 –delete –stats
-v – Ausführliche Ausgabe
-m Medium – Medium Codierungsgeschwindigkeit (kleinere höhere Qualität, alles, was langsamer ist, ist die Zeit / Qualität nicht wert)
-q 20 – Das verwendete CRF 20 ähnelt ungefähr 18 in x264, aber hey.Dies ist für 1080p-Inhalte (90% meines Fernsehgeräts). Ich verwende 22 für meine 4K-Filme.
-x – Verwenden Sie zentral definierte x265-Befehle.
–no-sao deaktiviert den adaptiven Beispielversatz (verbessert die Codierungsgeschwindigkeit)
–aq-mode 3 – Adaptive Quantisierung mit automatischer Varianz verwenden, hilft 8-Bit-Codierungen, insbesondere in dunklen Bereichen, zu stoppen Die meisten Streifen, die auftreten können (allerdings auf Kosten der Codierungszeit)
–delete – Codierungsdatei durch ersetzen codierte Datei (Test vor Verwendung dieser)
–stats – Schreiben Sie Statistiken in eine CSV-Datei im Stammverzeichnis
Die Codierungsgeschwindigkeit auf meinem Rig liegt bei etwa 30 fps (für die meisten 1080p-Inhalte). Dual Xeon E5 2687W v2, aber ich zwinge den FFMPEG-Prozess, nicht die erste Seite eines der Prozessoren zu verwenden (es ist mein Plex-Server, muss also sicherstellen, dass bei der Wiedergabe usw. Overhead für die Transcodierung vorhanden ist)
Ja, es hat eine Weile gedauert, das meiste davon zu konvertieren, und jetzt habe ich eine geplante Aufgabe, die zweimal am Tag ausgeführt wird, um das Material von diesem Tag auf x265 zu codieren.
Die Platzersparnis waren enorm. Mein anfängliches SAN wurde mit 20 TB verwendet, jetzt sind es ungefähr 12, aber es wurde offensichtlich auch mit 6 Monaten mehr Inhalt hinzugefügt.
Ich habe begonnen, alle meine Filme zu transkodieren, aber das ist es auch Ein fortlaufender Prozess, da ich Qualitätsstufen identifizieren muss (Radarr beschriftet dann glücklicherweise gut) und eine von drei Transcode-Einstellungen verwenden muss:
-m slower -q 18 -x --no-sao --aq-mode 3
für 720p-Transcodes
-m medium -q 20 -x --no-sao --aq-mode 3
für 1080p
-m medium -q 22 -x --no-sao
für 2160p
Ich hoffe, das hilft einigen Menschen. Schreien Sie, wenn jemand eine braucht Wenn Sie alles in x265 codieren, denken Sie über die Wiedergabe nach. Wenn der Client x265 native nicht unterstützt, kann die Transcade in Bezug auf CPU und Qualität teuer sein.
Kommentare
- Mit x265 2.4 und höher (mit den neuen Lambda-Tabellen , die schärfere Codierungen ergeben) ist SAO normalerweise eine gute Sache für die Qualität pro Bitrate. Es verschmiert immer noch leicht, reduziert aber andere Artefakte so stark, dass es sich lohnt.
-
-q 20
ist nicht CRF 20, sondern ‚ s konstante QP-Ratensteuerung . Der Standard- und empfohlene Modus, CRF, erhöht den QP in Szenen mit hoher Komplexität, sodass ‚ nicht zu viele Bits für Szenen ausgibt, die zu schwer zu bearbeiten sind kodieren. (Wenn Sie näher an einem einheitlichen QP sein möchten, erhöhen Sieqcomp
von 0,6 auf vielleicht 0,7 oder 0,8. Näher an 1,0 liegt näher an CQP.) - wie Behandeln Sie hdr / sdr-Codierungen, wenn Sie ‚ nicht wissen, was die Quelle ist?
Antwort
Die korrekte Syntax zum Aktivieren des verlustfreien Modus für den x265-Encoder in ffmpeg lautet -x265-params lossless=1
(Sie müssen =1
).
Für verlustfreie Codierung gibt es jedoch bessere Codec-Optionen. Beim Testen habe ich festgestellt, dass FFV1 zumindest bei einigen Arten von Videos (wenn die besten Einstellungen für beide ausgewählt sind) erheblich besser komprimiert wird (Dateigröße = ~ 80% von x265) Codecs). Und es funktioniert auch schneller und (AFAIK) ist nicht durch Patente belastet. Das heißt, es ist verlustfreiem H.265 in jeder Hinsicht für die Videoarchivierung überlegen. Der Kompromiss ist jedoch die Kompatibilität mit der aktuellen Wiedergabesoftware und -hardware.