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. -loglevel
direkt an ihn), bevor Sie die Eingaben deklarieren.
(c). Wenn Sie eine hardwarebeschleunigte Dekodierung verwenden, z. B. cuvid
deklarieren 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 -threads
Option 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.