it-swarm.com.de

Beste Einstellungen für FFMpeg mit NVENC

Ich verwende meinFFMPEGmit der Unterstützung meiner GPU (NVENC), um Dateien von meinem Satellitenempfänger (SD, mpeg2 .TS-Files) in h264 zu konvertieren. mp4-dateien

Hier ist die Linie, die ich benutze

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: Kann ich einige Verbesserungen vornehmen, um die Qualität bei gleicher Dateigröße zu verbessern und die Rechenleistung meiner Geforce GTX 1080 zu verbessern?

Ich fand ein paar Parameter von 林正浩 zu ändern, aber -preset slow sollte schon der beste Qualitätsansatz sein, oder?

17
Dr. Snail

Hier ist eine grobe Anleitung zum Einstellen des Encoders:

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

1. Beginnen Sie, indem Sie die Optionen des Encoders verstehen.

Beginnen Sie bei NVENC-basierten Encodern mit dem Erlernen der für jeden Encoder verfügbaren Optionen (Beachten Sie, dass ich unter Linux arbeite. Deshalb verwende ich xclip, um die Codec-Optionen in die Zwischenablage zu kopieren, bevor ich sie hier einfüge):

(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. Verstehe die Einschränkungen der Hardware und halte dich zuerst an die vernünftigen Standardeinstellungen, bevor du Optionen anwendest:

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

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

3. Die Syntax ist entscheidend:

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. -loglevel direkt an FFmpeg), bevor Sie Eingaben deklarieren.

(c). Wenn Sie eine hardwarebeschleunigte Dekodierung verwenden, z. B. cuvid, deklarieren Sie diese hier und geben Sie alle erforderlichen Argumente an. An dieser Stelle sollte unbedingt erwähnt werden, dass Decoder bestimmte Einschränkungen haben, wie z. B. erwartete Eingangsauflösungen, unterstützte Codecs usw. Als solche wird empfohlen, hardwarebeschleunigte Decoder in der Produktion zu deaktivieren, da dies zu diesem Zeitpunkt zu Fehlern führt in einer fehlgeschlagenen Codierung und ist nicht wiederherstellbar. Tatsächlich haben die MPV-Entwickler dies wiederholt erwähnt , verlassen Sie sich nicht auf die hardwarebeschleunigte Dekodierung für die Bereitstellung geschäftskritischer Inhalte.

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

(e). Fügen Sie optional einen Filter ein. Dies ist für Funktionen wie Größenänderung, Pixelformatkonversation, Deinterlacing usw. erforderlich. Beachten Sie, dass ein hardwarebasierter Decoder (wie in Abschnitt (c) beschrieben) abhängig von dem hier verwendeten Filter Einschränkungen einführt, die Ihr Filter erfüllen muss behandeln, oder Ihre Kodierung wird sonst fehlschlagen.

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

(G). Während FFmpeg das erforderliche Ausgabeformat einer Datei in Abhängigkeit von der ausgewählten Erweiterung der Ausgabedatei ableiten kann, wird empfohlen, das Ausgabeformat explizit (über die Option -f) zu deklarieren, damit bei Bedarf zusätzliche Optionen an den Muxer übergeben werden können. Wie so oft bei Streaming-Formaten wie HLS, MPEGTS und DASH.

(h). Der absolute Pfad zur Ausgabedatei.

Mit Ihrem obigen Beispiel, 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 versetzen und adaptive Quantisierungscodierungstechniken aktivieren (räumliche und zeitliche AQ-Methoden werden unterstützt und es kann jeweils nur eine verwendet werden. Beachten Sie, dass dadurch auch die B-Frame-Unterstützung deaktiviert wird) Optionales Aktivieren der unten gezeigten Techniken zur gewichteten Vorhersage sowie eines optionalen Filters für eine ordnungsgemäße Verkleinerung 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 setzt voraus, dass es sich bei der Eingabedatei um einen MPEG2-Stream handelt. Wenn dies nicht der Fall ist, 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 zur Threadanzahl (an ffmpeg über die Option -threads übergeben):

Mehr Encoder-Threads, die einen bestimmten Schwellenwert überschreiten, erhöhen die Latenz und haben einen höheren Speicherbedarf für die Codierung. Die Qualitätsverschlechterung ist aufgrund der erhöhten Codierungsverzögerung bei höheren Thread-Zählern im Modus mit konstanter Bitrate und im Modus mit nahezu konstanter Bitrate, der als VBV (Video Buffer Verifier) ​​bezeichnet wird, ausgeprägter. Keyframes benötigen mehr Daten als andere Frame-Typen, um das Pulsieren von Keyframes mit schlechter Qualität zu vermeiden.

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

Es ist daher ratsam, die Anzahl der Threads bei Codierungen zu begrenzen, bei denen es auf die Latenz ankommt, da der wahrgenommene Codiererdurchsatz alle Vorteile ausgleicht, die er auf lange Sicht bringen könnte.

Und da Sie unter Windows arbeiten, möchten Sie möglicherweise die Shell-Escapezeichen \ oben entfernen, da ich dies in einer Unix-Box schreibe, in der der obige Befehl getestet wird.

21
林正浩

Meine Erfahrung mit der Verwendung von nvenc ist, dass Sie angeben müssen, welche Bitrate Sie möchten - standardmäßig VBR, was in Ordnung ist, aber kein Optimierungsaufwand gleicht die Tatsache aus, dass Sie immer eine durchschnittliche Bitrate von 2 Millionen erhalten möchten, egal welche auflösungsdatei fütterst du dabei? Es scheint ein Fehler im Encoder zu sein. In jeder anderen Hinsicht ist die Leistung vorhersehbar, es wird jedoch beispielsweise -b:v 4M für eine 720p-Datei oder -b:v 8M für 1080p benötigt. Sie könnten diese wahrscheinlich auch ein wenig absenken, wenn Sie möchten.

1
serilain