it-swarm.com.de

Neukodierung der Videobibliothek in x265 (HEVC) ohne Qualitätsverlust

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 die gleiche 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 brauche also eine Methode, bei der avconv für jedes Video automatisch den Parameter anpasst, der angepasst werden muss.

UPDATE-1

Ich fand, dass crf der Knopf ist, den ich einstellen muss. Die Standard-CRF ist 28. Für eine bessere Qualität könnte ich weniger als 28 verwenden. Zum 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 ein CRF-Wert von 28 gut genug ist, während für einige Videos ein niedrigerer 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 die CRF entsprechend dem Eingangsvideo intelligent anpassen kann?

UPDATE-2

Ich habe festgestellt, dass es in x265 eine Option --lossless Gibt: 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
47
shivams

Wenn Sie aus eigener Erfahrung absolut keinen Qualitätsverlust wünschen, ist --lossless das, wonach Sie suchen.

Ich bin mir bei avconv nicht sicher, aber der von Ihnen eingegebene Befehl sieht identisch aus mit dem, was ich mit FFmpeg mache. 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 x265 Binär verwendet werden).

Damit möchte ich meine Erfahrungen mit der x265 - Codierung teilen. Für die meisten Videos (sei es WMV oder MPEG oder AVC/H.264) verwende ich crf=23. x265 Entscheidet den Rest der Parameter und macht normalerweise einen guten Job.

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. Angenommen, eine MKV-Datei mit Stream 0 ist Video, Stream 1 ist DTS Audio und Stream 2 ist ein Untertitel):

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 mache dies, um verschiedene Bits eines komplexen CLI-Eingangs zu verfolgen. 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 auf 0 Sekunden suchen, bevor Sie mit der Dekodierung der Eingabe beginnen, und -t 120 Bedeutet, dass nach 120 Sekunden das Schreiben in die Ausgabe beendet wird. Sie können auch die Zeitformate hh: mm: ss oder hh: mm: ss.sss verwenden.

Jetzt Zeile für Zeile:

  1. -hide_banner Verhindert, dass FFmpeg beim Start Build-Informationen anzeigt. Ich möchte es nur nicht sehen, wenn ich in der Konsole nach oben scrolle.
  2. -ss 0 Sucht nach 0 Sekunden, bevor mit der Dekodierung der Eingabe begonnen wird. Beachten Sie, dass, wenn dieser Parameter nach der Eingabedatei und vor der Ausgabedatei angegeben wird, er zu einer Ausgabeoption wird und ffmpeg, um die Eingabe bis zu x Sekunden zu dekodieren und zu ignorieren und dann mit dem Schreiben in die Ausgabe zu beginnen. Als Eingabemöglichkeit ist es 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, und zu Testzwecken möchten Sie keine Zeit verschwenden.
  3. -i "INPUT.mkv": Geben Sie die Eingabedatei an.
  4. -attach "COVER.jpg": Hängen Sie ein Cover (Miniaturbild, Poster, was auch immer) an die Ausgabe an. Das Cover wird normalerweise in Datei-Explorern angezeigt.
  5. -map_metadata 0: Kopieren Sie alle Metadaten von Eingabe 0, die im Beispiel nur die Eingabe ist.
  6. -map_chapters 0: Über Kapitelinformationen (falls vorhanden) von Eingang 0 kopieren;
  7. -metadata title="TITLE": Legen Sie den Titel des Videos fest.
  8. -map 0:0 ...: Ordnen Sie Stream 0 von Eingabe 0 zu, was bedeutet, dass der erste Stream von der Eingabe in die Ausgabe geschrieben werden soll. Da dieser Stream ein Videostream ist, ist er der erste Video Stream in der Ausgabe, daher der Stream-Bezeichner :s:v:0. Setzen Sie das Sprach-Tag auf Englisch.
  9. -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).
  10. -map 0:2 ...: Ähnlich wie Zeile 9, außer dass dieser Stream ein Untertitel ist.
  11. -metadata:s:t:0 ...: Legen Sie Metadaten für das Cover fest. Dies ist für das mkv-Containerformat erforderlich.
  12. -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 von diesem Doom9-Beitrag gestohlen ;
  13. crf=22:...: Fortsetzung der Video-Codec-Parameter. Siehe den oben erwähnten Forumsbeitrag;
  14. -c:a copy: Über Audio kopieren;
  15. -c:s copy: Über Untertitel kopieren;
  16. -t 120: Hören Sie nach 120 Sekunden auf, in die Ausgabe zu schreiben. Dadurch erhalten Sie einen 2-minütigen Clip für die Vorschau der Trancodierungsqualität.
  17. "OUTPUT.HEVC.DTS.Sample.mkv": Name der Ausgabedatei. Ich markiere meine Dateinamen mit dem Video-Codec und dem primären Audio-Codec.

Wütend. 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, da sie nicht stark mit Unix & Linux zusammenhängt.

62
Yifeng Mu

Ich habe mir kürzlich die Mühe gemacht, meinen gesamten Videokatalog auf HEVC zu übertragen. Ich verwende https://github.com/FallingSnow/h265ize mit den folgenden Einstellungen.

h265ize -v -m mittel -q 20 -x --no-sao --aq-mode 3 --delete --stats

- v - Ausführliche Ausgabe
- m mittel - Mittlere Codierungsgeschwindigkeit (kleinere höhere Qualität, alles, was langsamer ist, ist den Zeit-/Qualitätsunterschied nicht wert)
- q 20 - das verwendete CRF, 20 ist ungefähr 18 in x264, aber hey. Dies ist für 1080p-Inhalte (90% meines Fernsehgeräts). Ich verwende normalerweise 22 für meine 4K-Filme
- x - Verwenden Sie zentral definierte x265-Befehle
- no-sao deaktiviert den Sample Adaptive Offset (verbessert die Codierungsgeschwindigkeit)
- aq-mode 3 - Adaptive Quantisierung mit automatischer Varianz verwenden, hilft 8-Bit-Codierungen, insbesondere in dunklen Bereichen, stoppt die meisten Streifenbildung, die auftreten kann (allerdings auf Kosten der Codierungszeit)
- löschen - Codierungsdatei durch codierte Datei ersetzen (testen, bevor Sie diese verwenden)
- stats - Schreiben Sie Statistiken in eine CSV-Datei im Stammverzeichnis des Pfads, von dem aus Sie gelaufen sind.

Die Encode-Geschwindigkeit auf meinem Rig liegt bei 30 fps (für die meisten 1080p-Inhalte). Dual Xeon E5 2687W v2, aber ich erzwinge, dass der FFMPEG-Prozess nicht die erste Seite eines der Prozessoren verwendet (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 kodieren.

Die Platzersparnis war enorm. Mein anfängliches SAN war bei 20 TB Verwendung, jetzt ist es ungefähr 12, wurde aber offensichtlich auch mit 6 Monaten mehr Inhalt hinzugefügt.

Ich habe auch angefangen, alle meine Filme zu transkodieren, aber das ist ein fortlaufender Prozess, da ich Qualitätsstufen identifizieren muss (Radarr beschriftet dann glücklicherweise gut) und eine von drei Transcodierungseinstellungen 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

Hoffe das hilft einigen Leuten. Schreien Sie, wenn jemand eine Hand braucht, um alles einzurichten. Und bevor Sie alles in x265 codieren, denken Sie an die Wiedergabe. Wenn der Client x265 native nicht unterstützt, kann die Transcade in Bezug auf CPU und Qualität teuer sein.

Die korrekte Syntax zum Aktivieren des verlustfreien Modus für den x265-Encoder in ffmpeg lautet -x265-params lossless=1 (Sie müssen =1 Anhängen).

Für verlustfreie Codierung gibt es jedoch bessere Codec-Optionen. Ich habe beim Testen festgestellt, dass FFV1 zumindest bei einigen Arten von Videos (wenn die besten Einstellungen für beide Codecs gewählt werden) erheblich besser komprimiert wird (Dateigröße = ~ 80% von x265). 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.

3
Display Name