Beste Einstellungen für FFMpeg mit NVENC

16397
Dr. Snail

Ich verwende mein FFMPEG mit der Unterstützung meiner GPU ( NVENC ), um Dateien von meinem Satellitenempfänger (SD, mpeg2 .TS-Dateien) in h264 .mp4-Dateien umzuwandeln

Hier ist die Linie, die ich verwende

ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1 -qmin 10 -qmax 52 "e:\output.mp4" 

Aber die Qualität ist nicht so gut wie erwartet. Und die volle Leistung meines Systems wird nicht genutzt:

enter image description here

Nur 11% GPU und 30% CPU-Auslastung.

Frage: Gibt es einige Verbesserungen, die ich vornehmen kann, um die Qualität bei gleicher Dateigröße zu verbessern und mehr Rechenleistung für meine Geforce GTX 1080 zu verwenden?

Ich habe ein paar Parameter von 林正浩 gefunden, die geändert werden -preset slowsollten, aber sollte schon der beste Qualitätsansatz richtig sein?

13

2 Antworten auf die Frage

13
林正浩

Hier ist eine grobe Anleitung zum Abstimmen des Encoders:

Wir werden von den Grundlagen ausgehen, da es nachteilig ist, zu der Schlussfolgerung zu gelangen, dass eine schnelle Auswahl an Optionen die erwartete Leistung plötzlich verbessert, ohne die gewünschten Ziele und Erwartungen zu verstehen:

1. Beginnen Sie mit dem Verstehen der Encoder-Optionen.

Bei NVENC-basierten Encodern sollten Sie zunächst die Optionen kennen lernen, die jeder Encoder benötigt (Beachten Sie, dass ich unter Linux arbeite. Deshalb verwende ich xclip, um die Codec-Optionen in die Zwischenablage zu kopieren, bevor Sie sie hier einfügen.)

(ein). Für den H.264-Encoder:

ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip 

Ausgabe:

Encoder h264_nvenc [NVIDIA NVENC H.264 encoder]: General capabilities: delay  Threading capabilities: none Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda h264_nvenc AVOptions: -preset <int> E..V.... Set the encoding preset (from 0 to 11) (default medium) default E..V....  slow E..V.... hq 2 passes medium E..V.... hq 1 pass fast E..V.... hp 1 pass hp E..V....  hq E..V....  bd E..V....  ll E..V.... low latency llhq E..V.... low latency hq llhp E..V.... low latency hp lossless E..V....  losslesshp E..V....  -profile <int> E..V.... Set the encoding profile (from 0 to 3) (default main) baseline E..V....  main E..V....  high E..V....  high444p E..V....  -level <int> E..V.... Set the encoding level restriction (from 0 to 51) (default auto) auto E..V....  1 E..V....  1.0 E..V....  1b E..V....  1.0b E..V....  1.1 E..V....  1.2 E..V....  1.3 E..V....  2 E..V....  2.0 E..V....  2.1 E..V....  2.2 E..V....  3 E..V....  3.0 E..V....  3.1 E..V....  3.2 E..V....  4 E..V....  4.0 E..V....  4.1 E..V....  4.2 E..V....  5 E..V....  5.0 E..V....  5.1 E..V....  -rc <int> E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1) constqp E..V.... Constant QP mode vbr E..V.... Variable bitrate mode cbr E..V.... Constant bitrate mode vbr_minqp E..V.... Variable bitrate mode with MinQP (deprecated) ll_2pass_quality E..V.... Multi-pass optimized for image quality (deprecated) ll_2pass_size E..V.... Multi-pass optimized for constant frame size (deprecated) vbr_2pass E..V.... Multi-pass variable bitrate mode (deprecated) cbr_ld_hq E..V.... Constant bitrate low delay high quality mode cbr_hq E..V.... Constant bitrate high quality mode vbr_hq E..V.... Variable bitrate high quality mode -rc-lookahead <int> E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0) -surfaces <int> E..V.... Number of concurrent surfaces (from 0 to 64) (default 0) -cbr <boolean> E..V.... Use cbr encoding mode (default false) -2pass <boolean> E..V.... Use 2pass encoding mode (default auto) -gpu <int> E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any) any E..V.... Pick the first device available list E..V.... List the available devices -delay <int> E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX) -no-scenecut <boolean> E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false) -forced-idr <boolean> E..V.... If forcing keyframes, force them as IDR frames. (default false) -b_adapt <boolean> E..V.... When lookahead is enabled, set this to 0 to disable adaptive B-frame decision (default true) -spatial-aq <boolean> E..V.... set to 1 to enable Spatial AQ (default false) -temporal-aq <boolean> E..V.... set to 1 to enable Temporal AQ (default false) -zerolatency <boolean> E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false) -nonref_p <boolean> E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false) -strict_gop <boolean> E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false) -aq-strength <int> E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8) -cq <float> E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0) -aud <boolean> E..V.... Use access unit delimiters (default false) -bluray-compat <boolean> E..V.... Bluray compatibility workarounds (default false) -init_qpP <int> E..V.... Initial QP value for P frame (from -1 to 51) (default -1) -init_qpB <int> E..V.... Initial QP value for B frame (from -1 to 51) (default -1) -init_qpI <int> E..V.... Initial QP value for I frame (from -1 to 51) (default -1) -qp <int> E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1) -weighted_pred <int> E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0) -coder <int> E..V.... Coder type (from -1 to 2) (default default) default E..V....  auto E..V....  cabac E..V....  cavlc E..V....  ac E..V....  vlc E..V....  

(b). Für den HEVC / H.265-Encoder:

ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip 

Ausgabe:

Encoder hevc_nvenc [NVIDIA NVENC hevc encoder]: General capabilities: delay  Threading capabilities: none Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda hevc_nvenc AVOptions: -preset <int> E..V.... Set the encoding preset (from 0 to 11) (default medium) default E..V....  slow E..V.... hq 2 passes medium E..V.... hq 1 pass fast E..V.... hp 1 pass hp E..V....  hq E..V....  bd E..V....  ll E..V.... low latency llhq E..V.... low latency hq llhp E..V.... low latency hp lossless E..V.... lossless losslesshp E..V.... lossless hp -profile <int> E..V.... Set the encoding profile (from 0 to 4) (default main) main E..V....  main10 E..V....  rext E..V....  -level <int> E..V.... Set the encoding level restriction (from 0 to 186) (default auto) auto E..V....  1 E..V....  1.0 E..V....  2 E..V....  2.0 E..V....  2.1 E..V....  3 E..V....  3.0 E..V....  3.1 E..V....  4 E..V....  4.0 E..V....  4.1 E..V....  5 E..V....  5.0 E..V....  5.1 E..V....  5.2 E..V....  6 E..V....  6.0 E..V....  6.1 E..V....  6.2 E..V....  -tier <int> E..V.... Set the encoding tier (from 0 to 1) (default main) main E..V....  high E..V....  -rc <int> E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1) constqp E..V.... Constant QP mode vbr E..V.... Variable bitrate mode cbr E..V.... Constant bitrate mode vbr_minqp E..V.... Variable bitrate mode with MinQP (deprecated) ll_2pass_quality E..V.... Multi-pass optimized for image quality (deprecated) ll_2pass_size E..V.... Multi-pass optimized for constant frame size (deprecated) vbr_2pass E..V.... Multi-pass variable bitrate mode (deprecated) cbr_ld_hq E..V.... Constant bitrate low delay high quality mode cbr_hq E..V.... Constant bitrate high quality mode vbr_hq E..V.... Variable bitrate high quality mode -rc-lookahead <int> E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0) -surfaces <int> E..V.... Number of concurrent surfaces (from 0 to 64) (default 0) -cbr <boolean> E..V.... Use cbr encoding mode (default false) -2pass <boolean> E..V.... Use 2pass encoding mode (default auto) -gpu <int> E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any) any E..V.... Pick the first device available list E..V.... List the available devices -delay <int> E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX) -no-scenecut <boolean> E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false) -forced-idr <boolean> E..V.... If forcing keyframes, force them as IDR frames. (default false) -spatial_aq <boolean> E..V.... set to 1 to enable Spatial AQ (default false) -temporal_aq <boolean> E..V.... set to 1 to enable Temporal AQ (default false) -zerolatency <boolean> E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false) -nonref_p <boolean> E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false) -strict_gop <boolean> E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false) -aq-strength <int> E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8) -cq <float> E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0) -aud <boolean> E..V.... Use access unit delimiters (default false) -bluray-compat <boolean> E..V.... Bluray compatibility workarounds (default false) -init_qpP <int> E..V.... Initial QP value for P frame (from -1 to 51) (default -1) -init_qpB <int> E..V.... Initial QP value for B frame (from -1 to 51) (default -1) -init_qpI <int> E..V.... Initial QP value for I frame (from -1 to 51) (default -1) -qp <int> E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1) -weighted_pred <int> E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0) 

2. Machen Sie sich mit den Einschränkungen der Hardware vertraut und halten Sie sich an die Standardeinstellungen, bevor Sie Optionen anwenden:

In dieser Antwort finden Sie die Hardwareeinschränkungen, auf die Sie mit NVENC stoßen, insbesondere für HEVC-Codierungen unter Pascal.

Fahren Sie dann anhand dieser Informationen mit dem nächsten Schritt fort.

3. Die Syntax ist kritisch:

Hier ist die Reihenfolge, in der Sie Argumente an FFmpeg übergeben müssen:

(ein). Rufen Sie die Binärdatei auf.

(b). Übergeben Sie alle Argumente an FFmpeg (z. B. -logleveldirekt an ihn), bevor Sie die Eingaben deklarieren.

(c). Wenn Sie eine hardwarebeschleunigte Dekodierung verwenden, z. B. cuviddeklarieren Sie sie hier und fügen Sie die erforderlichen Argumente hinzu. An dieser Stelle muss unbedingt erwähnt werden, dass Decoder bestimmte Einschränkungen aufweisen, wie etwa erwartete Eingabeauflösungen, unterstützte Codecs usw., und daher empfiehlt es sich, in der Produktion hardwarebeschleunigte Decoder zu deaktivieren, da an dieser Stelle Fehler auftreten in einer fehlgeschlagenen Kodierung und ist nicht wiederherstellbar. In der Tat haben die MPV-Entwickler dies wiederholt erwähnt . Sie müssen sich nicht auf hardwarebeschleunigte Dekodierung verlassen, um geschäftskritische Inhalte bereitzustellen.

(d). Deklarieren Sie Ihre Eingaben. Verwenden Sie für Streams die URL und fügen Sie bei Bedarf zusätzliche Flags (z. B. Puffergrößen) voran. Für lokale Ressourcen (in einem zugänglichen Dateisystem) ist der absolute Dateipfad erforderlich.

(e). Legen Sie optional einen Filter ein. Dies ist für Funktionen wie Größenänderung, Pixelformat-Konversationen, Deinterlacing usw. erforderlich. Beachten Sie, dass abhängig vom verwendeten Filter ein hardwarebasierter Decoder (wie in Abschnitt (c) beschrieben) Einschränkungen auferlegt, die Ihr Filter erfüllen kann Handle, sonst schlägt deine Kodierung fehl.

(f). Rufen Sie die entsprechenden Video- und Audio-Encoder auf, und übergeben Sie ihnen die erforderlichen Argumente wie Mappings, Bitraten, Encoder-Presets usw.

(G). Während FFmpeg das erforderliche Ausgabeformat einer Datei abhängig von der ausgewählten Erweiterung der Ausgabedatei ableiten kann, wird empfohlen, das Ausgabeformat explizit zu deklarieren (über die Option -f), damit bei Bedarf zusätzliche Optionen an den Muxer übergeben werden können. wie dies häufig bei Streaming-Formaten wie HLS, mpegts und DASH der Fall ist.

(h). Der absolute Pfad zur Ausgabedatei.

Mit Ihrem Beispiel oben zitiert als:

ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1 -qmin 10 -qmax 52 "e:\output.mp4" 

Sie können die Ausgabequalität erhöhen, indem Sie eine höhere Bitrate ausgleichen und adaptive Quantisierungscodiertechniken aktivieren (räumliche und zeitliche AQ-Methoden werden unterstützt, von denen jeweils nur eine verwendet werden kann. Beachten Sie, dass dadurch auch die B-Frame-Unterstützung deaktiviert wird) und Aktivieren Sie optional gewichtete Vorhersagetechniken (siehe unten) sowie einen optionalen Filter für eine korrekte Herunterskalierung und Größenänderung, falls erforderlich:

ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v mpeg2_cuvid -i "e:\input.ts" \ -filter:v scale_npp=w=1920:h=1080:format=yuv420p:interp_algo=lanczos \ -c:v h264_nvenc -preset:v llhq -profile:v main -level:v 4.1 -rc:v ll_2pass_quality -rc-lookahead:v 32 -temporal-aq:v 1 -weighted_pred:v 1 -coder:v cabac \ -f mp4 "e:\output.mp4" 

Das obige Snippet geht davon aus, dass es sich bei der Eingabedatei um einen MPEG2-Stream handelt. Ist dies nicht der Fall, wechseln Sie nach der Analyse zum richtigen CUVID-Decoder:

ffprobe -i e:\input.ts 

Wenn es sich um 'H.264 / AVC' handelt, ändern Sie das Snippet wie folgt:

ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \ -filter:v scale_npp=w=1920:h=1080:format=yuv420p:interp_algo=lanczos \ -c:v h264_nvenc -preset:v llhq -profile:v main -level:v 4.1 -rc:v ll_2pass_quality -rc-lookahead:v 32 -temporal-aq:v 1 -weighted_pred:v 1 -coder:v cabac \ -f mp4 "e:\output.mp4" 

Ein zusätzlicher Hinweis zu Thread-Zählungen (wird über die -threadsOption an ffmpeg übergeben ):

Mehr Encoder-Threads, die einen bestimmten Schwellenwert überschreiten, erhöhen die Latenz und haben einen höheren Footprint für den Codierungsspeicher. Eine Qualitätsverschlechterung ist bei höheren Thread-Zählungen im Modus mit konstanter Bitrate und im Modus mit nahezu konstanter Bitrate, der als VBV (Video Buffer Verifier) ​​bezeichnet wird, aufgrund einer erhöhten Codierungsverzögerung deutlicher. Keyframes benötigen mehr Daten als andere Frame-Typen, um zu vermeiden, dass Keyframes mit schlechter Qualität pulsieren.

Der Zero-delay- oder Sliced-Thread-Modus hat keine Verzögerung, aber diese Option verschlechtert die Multithread-Qualität in unterstützten Encodern.

Es ist daher ratsam, die Anzahl der Threads auf Codierungen zu begrenzen, bei denen die Latenz eine Rolle spielt, da der wahrgenommene Encoder-Durchsatz die möglichen Vorteile auf lange Sicht ausgleichen kann.

Und da Sie unter Windows arbeiten, möchten Sie möglicherweise die \oben genannten Shell-Escape- Anweisungen entfernen, da ich dies aus einer Unix-Box schreibe, um den obigen Befehl zu testen.

Epos! Vielen Dank, nachdem Sie so lange mit Hardware-Kodierung gearbeitet haben, würden Sie diese über die CPU-Kodierung einführen oder sind die Nachteile von Qualität / Dateigröße immer noch so groß? Ich meine, es gibt viele Verbesserungen, die in NVENC und NVENC HQ vorgenommen wurden, sollten im Vergleich zu Standard x264 von gleicher Qualität sein Dr. Snail vor 6 Jahren 1
@ Dr.Snail Ich würde empfehlen, zunächst die Anforderungen Ihres Workflows zu beurteilen und alle Faktoren zu berücksichtigen, bevor Sie zu einer hardwarebasierten Kodierungslösung wechseln. Zum einen wird NVENC wie andere SIP-basierte Kodierungslösungen immer eine wesentlich schnellere Leistung bei höherer Energieeffizienz bieten als bei einer softwarebasierten Implementierung. Alle anderen Faktoren sind konstant. Wenden Sie die erwarteten Qualitätsabweichungen an, und belasten Sie dann die nicht unterstützten Funktionen. Mit NVENC können wir beispielsweise keine HDR-Informationen direkt einfügen und müssen dafür ein externes Werkzeug verwenden. 林正浩 vor 6 Jahren 0
Tools wie diese: https://github.com/SK-Hardwired/nv_hevc_hdr_patcher. 林正浩 vor 6 Jahren 0
Sie wählen "scale_npp = w = 1920: h = 1080", weil Filter eine Sache sind, die am meisten von GPU profitieren, oder? Die Begrenzung der Bitrate durch `-b: v 1000k -minrate 500k -maxrate 3000k scheint die Ausgabegröße vorhersagbarer zu machen Dr. Snail vor 6 Jahren 0
Ja, @ Dr.Snail. Vorhersagbare Dateigrößen haben Priorität. 林正浩 vor 6 Jahren 0
0
serilain

Ich habe mit nvenc die Erfahrung gemacht, dass Sie sagen müssen, welche Bitrate Sie wünschen - es ist standardmäßig VBR eingestellt, was in Ordnung ist, aber kein Tuning macht die Tatsache wett, dass es Ihnen immer eine durchschnittliche Bitrate von 2M geben möchte welche Auflösungsdatei Sie füttern. Es scheint ein Fehler im Encoder zu sein; es ist in jeder anderen Hinsicht vorhersagbar, benötigt aber (zum Beispiel) -b:v 4Meine 720p-Datei oder -b:v 8M1080p. Sie könnten diese wahrscheinlich auch etwas senken, wenn Sie möchten.