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

43

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 gut und die Qualität ist die gleiche wie zuvor. Einige Videos mit sehr hoher Qualität (z. B. ein Filmabzug 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 crfParameter in meiner Befehlszeile ändern ? Oder etwas anderes?

Die Sache ist, ich mache eine Massenumwandlung. Also brauche ich eine Methode, bei der avconvjeder Parameter für jedes Video automatisch angepasst wird.

UPDATE-1

Ich habe festgestellt, dass dies crfder Knopf ist, den ich einstellen muss. Das Standard-CRF ist 28. Für eine bessere Qualität könnte ich etwas 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 ausreichend ist, während für einige Videos ein niedrigerer CRF-Wert erforderlich ist. Dies muss ich manuell überprüfen, indem ich kleine Abschnitte der großen Videos konvertiere. Wie kann ich bei der Massenkonvertierung jedes Video manuell überprüfen? Ist es eine Art und Weise, avconvwie CRF intelligent an das Eingangsvideo angepasst werden kann?

UPDATE-2

Ich habe festgestellt, dass es --losslessin x265 eine Option gibt : http://x265.readthedocs.org/en/default/lossless.html .

Ich weiß jedoch nicht, wie ich es richtig verwenden soll. Ich habe versucht, es auf die 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
shivams
quelle
1
--losslesskönnte in der Tat die Datei vergrößern, wenn sie den zuvor verlustbehafteten Codec decodiert und dann codiert, was sie verlustfrei decodiert hat. Die Qualität bleibt genauso wie die Eingabe.
Golar Ramblar
2
Wenn Ihre Quellen verlustbehaftet codiert sind (was am wahrscheinlichsten ist), ist das, was Sie erreichen möchten, unmöglich. Jede Transkodierung, die nicht verlustfrei ist, verschlechtert die Qualität weiter (auch wenn sie für Sie nicht sofort sichtbar ist). Wenn Sie von verlustbehaftet zu verlustfrei konvertieren, erhalten Sie größere Dateien.
Sarge Borsch

Antworten:

58

Aus eigener Erfahrung, wenn Sie absolut keinen Qualitätsverlust wollen, ist - lossless das, wonach Sie suchen.

avconvIch bin mir nicht sicher, aber der von Ihnen eingegebene Befehl sieht genauso aus, wie ich es tue FFmpeg. In können FFmpegSie den Parameter wie folgt übergeben:

ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv

Die meisten x265Schalter (Optionen ohne Wert) können auf diese Weise angegeben werden (mit Ausnahme der nur über die Befehlszeilenschnittstelle verfügbaren Schalter, die nur mit x265Binärdateien direkt verwendet werden).

Damit möchte ich meine Erfahrungen mit dem x265Codieren teilen . Für die meisten Videos (sei es WMV, MPEG oder AVC / H.264) verwende ich crf=23. x265entscheidet den Rest der Parameter und erledigt in der Regel einen guten Job.

Bevor ich mich jedoch dazu entscheide, 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 als Video, Stream 1 als DTS-Audio und Stream 2 als 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 das, um die verschiedenen Bits einer komplexen CLI-Eingabe zu verfolgen. Bevor ich es zeilenweise erkläre, ist der Teil, in dem Sie nur einen kleinen Teil eines Videos konvertieren, die zweite und die vorletzte Zeile: -ss 0bedeutet, dass vor dem Dekodieren der Eingabe auf 0 Sekunden gesucht wird und -t 120das Schreiben in die Ausgabe abgebrochen wird nach 120 Sekunden. Sie können auch die Zeitformate hh: mm: ss oder hh: mm: ss.sss verwenden.

Jetzt Zeile für Zeile:

  1. -hide_bannerverhindert, FFmpegdass beim Start Build-Informationen angezeigt werden. Ich möchte es nur nicht sehen, wenn ich in der Konsole nach oben scrolle.
  2. -ss 0Sucht auf 0 Sekunden, bevor der Eingang dekodiert wird. Beachten Sie, dass dieser Parameter, wenn er nach der Eingabedatei und vor der Ausgabedatei angegeben wird, zu einer Ausgabeoption wird und ffmpeganweist, die Eingabe bis x Sekunden zu dekodieren und zu ignorieren und dann in die Ausgabe zu schreiben. Als Eingabemöglichkeit ist es weniger genau (da das Suchen in den meisten Containerformaten nicht genau ist), benötigt aber fast keine Zeit. Als Ausgabeoption ist es sehr genau, benötigt aber eine beträchtliche 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": Fügen Sie der Ausgabe ein Titelbild (Miniaturbild, Poster usw.) hinzu. 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: Kapitelinfo (falls vorhanden) von Eingang 0 kopieren;
  7. -metadata title="TITLE": Stellen Sie den Titel des Videos ein;
  8. -map 0:0 ...: Ordne Stream 0 von Input 0 zu, was bedeutet, dass der erste Stream vom Input in den Output geschrieben werden soll. Da es sich bei diesem Stream um einen Videostream handelt, handelt es sich um den ersten Videostream in der Ausgabe , daher der Streamspezifizierer :s:v:0. Setzen Sie das Sprachkennzeichen 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 Playern).
  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 lange her, dass ich es in zwei Zeilen aufgeteilt habe. Diese Einstellung eignet sich für qualitativ hochwertiges Weichzeichnungsvideo (1080p) mit minimaler Streifenbildung im Farbverlauf (was x265 scheiße macht). Es ist höchstwahrscheinlich ein Overkill für DVDs, Fernsehsendungen und Telefonvideos. Diese Einstellung wird meistens von diesem Doom9-Post gestohlen .
  13. crf=22:...: Fortsetzung der Videocodec-Parameter. Siehe den oben erwähnten Forumsbeitrag;
  14. -c:a copy: Kopieren über Audio;
  15. -c:s copy: Kopieren über Untertitel;
  16. -t 120: Hören Sie nach 120 Sekunden auf, auf den Ausgang zu schreiben. Dadurch erhalten wir einen zweiminütigen Clip für die Vorschau der Trancoding-Qualität.
  17. "OUTPUT.HEVC.DTS.Sample.mkv": Name der Ausgabedatei. Ich beschrifte meine Dateinamen mit dem Video-Codec und dem primären Audio-Codec.

Wütend. Dies ist meine erste Antwort. Wenn ich etwas übersehen habe, hinterlasse bitte einen Kommentar. Ich bin kein Experte für Videoproduktionen, ich bin nur ein Typ, der zu faul ist, einen Film anzusehen, indem er die Disc in den Player legt.

PS. Vielleicht gehört diese Frage woanders hin, da sie nicht stark mit Unix und Linux verwandt ist.

Yifeng Mu
quelle
2
Genau das, wonach ich gesucht habe! Gute Abdeckung der Optionen. Wissen Sie, ob ffmpeg blockiert, c:s copywenn es keinen Untertitelinhalt gibt?
Elder Geek
1
@ElderGeek Nein, ffmpeg sagt nur dann etwas, wenn sich diese Option auswirkt.
Yifeng Mu
Erzeugt diese Option die kleinstmögliche Dateigröße für eine wirklich verlustfreie h265-Codierung? Wenn nicht, gibt es eine Möglichkeit, dies zu tun?
Buffer Over Read
1
@TheBitByte Ich glaube nicht, dass es in h265 eine verlustfreie Komprimierungsstufe gibt. Für die Option ohne Komprimierung ist es nur --lossless. Ich habe vergeblich nach einer verlustfreien Umstellung von h264 auf h265 gesucht, und was ich gelernt habe, sagt mir, dass es mathematisch unmöglich ist.
Yifeng Mu
1
Sie sollten den Befehl, der den --losslessSchalter enthält, wirklich aus dieser Antwort heraus editieren , da es sich als Antwort auf diese Frage so anhört, als ob Sie sagen, dass es sich um verlustfreie Komprimierung handelt, was irreführend ist.
Hashim
8

Ich habe vor kurzem 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 ich langsamer finde, ist den Zeit- / Qualitätsunterschied nicht wert)
-q 20 - die verwendete CRF, 20 ist ungefähr 18 in x264, aber hey. Dies gilt für 1080p-Inhalte (90% meines Fernsehgeräts). Ich verwende normalerweise 22 für meine 4K-Filme.
-X - Verwende zentral definierte
x265- Befehle.
--No-sao deaktiviert den adaptiven Sample-Offset (verbessert die Codierungsgeschwindigkeit). --Aq-Modus 3 - Adaptive Quantisierung mit automatischer Varianz verwenden. Hilft 8-Bit-Codierungen, insbesondere in dunklen Bereichen, zu
stoppen, dass die meisten Streifen auftreten können (allerdings auf Kosten der Codierungszeit) . - Löschen - Codierungsdatei durch codierte Datei ersetzen (vor Verwendung dieser Datei testen )
--stats - Schreiben Sie Statistiken in eine csv-Datei im Stammverzeichnis des Pfads, von dem aus Sie ausgeführt haben.

Die Codierungsgeschwindigkeiten auf meinem Rig liegen bei 30 fps (für die meisten 1080p-Dateien). Dual Xeon E5 2687W v2, aber ich erzwinge, dass der FFMPEG-Prozess nicht die erste Seite eines der Prozessoren verwendet.

Ja, es hat eine Weile gedauert, das meiste davon zu konvertieren, und jetzt habe ich eine geplante Aufgabe, die zweimal täglich ausgeführt wird, um die Inhalte von diesem Tag auf x265 zu verschlüsseln.

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

Ich habe angefangen, alle meine Filme zu transkodieren, aber das ist ein fortlaufender Prozess, da ich Qualitätsstufen identifizieren muss (Radarr etikettiert glücklicherweise dann nett) und eine von drei Transkodierungseinstellungen verwenden muss:

-m slower -q 18 -x --no-sao --aq-mode 3für 720p transcodes
-m medium -q 20 -x --no-sao --aq-mode 3für 1080p
-m medium -q 22 -x --no-saofür 2160p

Hoffe das hilft einigen Leuten. Ruf, wenn jemand eine Hand braucht, die alles einrichtet. Und bevor Sie alles in x265 codieren, sollten Sie über die Wiedergabe nachdenken. Wenn der Client x265 native nicht unterstützt, kann die Übertragung in Bezug auf CPU und Qualität teuer werden.

Ashleigh-Paul Charlesworth
quelle
Mit x265 2.4 und höher (mit den neuen Lambda-Tabellen , die schärfere Codierungen liefern) ist SAO normalerweise eine gute Sache für die Qualität pro Bitrate. Es verschmiert immer noch leicht, reduziert aber andere Artefakte so weit, dass es sich lohnt.
Peter Cordes
-q 20ist nicht CRF 20, es ist eine konstante QP-Ratensteuerung . Der voreingestellte und empfohlene Modus CRF erhöht den QP bei Szenen mit hoher Komplexität, damit nicht zu viele Bits für Szenen ausgegeben werden, die zu schwer zu codieren sind. (Wenn Sie eine gleichmäßigere QP wünschen, erhöhen Sie qcompdie Standardeinstellung von 0,6 auf 0,7 oder 0,8. Eine Annäherung an 1,0 bedeutet eine Annäherung an die CQP.)
Peter Cordes,
3

Die korrekte Syntax zum Aktivieren des verlustfreien Modus für den x265-Encoder in ffmpeg lautet -x265-params lossless=1(muss angehängt werden =1).

Für verlustfreie Codierung gibt es jedoch bessere Codec-Auswahlmöglichkeiten. Ich habe beim Testen festgestellt, dass FFV1 zumindest bei einigen Arten von Videos (wenn für beide Codecs die besten Einstellungen gewählt wurden) wesentlich besser komprimiert (Dateigröße = ~ 80% von x265). Und es funktioniert auch schneller und (AFAIK) ist nicht durch Patente belastet. Das heißt, es ist in jeder Hinsicht verlustfreiem H.265 für die Videoarchivierung überlegen.

Sarge Borsch
quelle