Wie kann ich die CRF-Codierung mit nvenc in ffmpeg verwenden?

22

Dies ist mein aktueller Befehl zum Ändern der Größe von Videos (1080p) von 2 GB auf 300 MB, der jedoch viel Zeit in Anspruch nimmt:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v  libx264 -preset slow -crf 21 -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

Ich habe nvenc mit meiner NVIDIA GTX1070 ausprobiert:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v h264_nvenc -preset slow -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

Die Ausgabegröße beträgt immer 3⨉ oder 5⨉ der Originalgröße - nvenc wird nicht verwendet -crf.

Wie verwende ich nvenc mit ffmpeg, um ein Video mit hoher Qualität und kleiner Größe zu konvertieren / zu skalieren? Soll ich die GPU zum Codieren verwenden?

hongducwb
quelle
Sie können ändern , slowum fastin Ihrem ersten Befehl. CRF ist in nicht implementiert nvenc.
Gyan
Das Ziel von NVENC ist es, Videokodierung in Echtzeit zu ermöglichen (z. B. für Videoanrufe). Qualität ist eine untergeordnete Überlegung.
CL.

Antworten:

23

Übergeben Sie für CRF-basierte Codierungen die folgenden Argumente im folgenden Codeausschnitt an FFmpeg:

-c:v h264_nvenc -rc:v vbr_hq -cq:v 19 -b:v 2500k -maxrate:v 5000k -profile:v high

Natürlich müssen Sie die Zielbitraten und einen festen cqWert anpassen . 19 ist die empfohlene Einstellung, da sie visuell mit 0 identisch ist und dennoch einen guten Komprimierungskomfort in Bezug auf die Dateigröße bietet. In diesem Artikel erfahren Sie mehr über die Funktionsweise von CNI.

Es ist zu beachten, dass die -cqSkala logarithmisch ist, was bedeutet, dass 0 im Wesentlichen verlustfrei ist und 51 das absolut schlechteste wäre.

Die Qualität kann durch Hinzufügen von Optionen wie B-Frames weiter verbessert werden (beschränken Sie diese auf höchstens 3, und dies erfordert das H.264-Hauptprofil und höher. Basisprofile unterstützen keine B-Frames. Übergeben Sie dazu -bf {uint}an der Video-Encoder, so dass -bf:v 4der Encoder 4 B-Frames verwenden würde.

Die wichtigsten Bestandteile sind das -cq:v 19und die -rc:v vbr_hqArgumente, mit denen Sie den Encoder sowohl mit einer voreingestellten variablen Bitrate als auch mit einer maximal zulässigen Bitrate ( -b:vund -maxrate:v) abstimmen können, während Sie einen CRF-Wert von 19 einhalten .

Und jetzt ein paar Anmerkungen zu NVENC und zur Optimierung für hochwertige Codierungen:

Wie bei jedem anderen hardwarebasierten Encoder unterliegt NVENC mehreren Einschränkungen. Insbesondere bei HEVC gelten die folgenden bekannten Einschränkungen:

  1. Auf Pascal:

    Für HEVC-Codierungen gelten die folgenden Einschränkungen:

    • CTU-Größen über 32 werden nicht unterstützt.
    • B-Frames in HEVC werden ebenfalls nicht unterstützt.
    • Die vom NVENC-Encoder unterstützten Texturformate begrenzen die Farbräume, mit denen der Encoder arbeiten kann. Im Moment unterstützen wir 4: 2: 0 (8-Bit) und 4: 4: 4 (für 10-Bit). Fremdformate wie 4: 2: 2 10-Bit werden nicht unterstützt. Dies wirkt sich auf einige Workflows aus, in denen solche Farbräume erforderlich sind.
    • Die Vorausschau-Steuerung ist ebenfalls auf 32 Frames beschränkt. In diesem Editorial finden Sie möglicherweise weitere Informationen.

Turing bietet alle für Pascal verfügbaren Verbesserungen, einschließlich der B-Frame-Unterstützung für HEVC und der Möglichkeit, B-Frames als Referenz zu verwenden. In dieser Antwort finden Sie ein Beispiel für diese Funktion.

  1. Und bei Maxwell Gen 2 (GPUs der GM200x-Serie):

    Bei der HEVC-Codierung fehlen die folgenden Funktionen:

    • Sample Adaptive Offset (SAO) Schleifenfilterfunktionen.
    • Adaptive Quantisierung
    • Vorausschau-Geschwindigkeitskontrolle.

Die Auswirkung für Maxwell ist, dass bewegungsintensive Szenen mit HEVC unter eingeschränkten Bitraten aufgrund der fehlenden Lookahead-Funktionen und der SAO-Schleifenfilterfunktionen (Adaptive Sample Offset) unter Artefakten (Blockiness) leiden können. Pascal hat diese Funktion etwas verbessert, aber je nach der Version des SDK, mit dem der Video-Encoder erstellt wurde, sind möglicherweise nicht alle Funktionen verfügbar.

Beispielsweise erfordert der Modus für gewichtete Vorhersage für H.264-Codierungen in Pascal NVENC SDK 8.0x und höher, und dieser Codierungsmodus deaktiviert auch die B-Frame-Unterstützung. Ebenso kann die Kombination von hardwarebasierten Skalierern, die auf den Nvidia Performance Primitives (NPP) mit NVENC ausgeführt werden, zu Leistungsverbesserungen bei Videoskalierungsanwendungen führen, und zwar auf Kosten der Skalierung von Artefakten, insbesondere bei hochskaliertem Inhalt. Dies wirkt sich auch auf die Videokodierungs-Pipeline aus, da die NPP-Skalierungsfunktionen von den CUDA-Kernen auf der GPU ausgeführt werden. Daher sollte die durch die zusätzliche Last verursachte Auswirkung auf die Leistung von Fall zu Fall analysiert werden, um festzustellen, ob die Leistungsqualität stimmt Kompromiss ist akzeptabel.

Beachten Sie Folgendes: Ein hardwarebasierter Encoder bietet immer eine etwas geringere Anpassung als eine entsprechende softwarebasierte Implementierung, sodass sich Ihre Laufleistung und die akzeptable Ausgabequalität immer unterscheiden.

Und für ihre referenz:

Mit FFmpeg können Sie jederzeit auf die Einstellungen eines Encoders zugreifen, um sie anzupassen:

ffmpeg -h encoder {encoder-name}

Für NVENC-basierte Encoder können Sie also Folgendes ausführen:

ffmpeg -h encoder=hevc_nvenc

ffmpeg -h encoder=h264_nvenc

Sie können auch alle NVENC-basierten Encoder und NPP-basierten Scaler (sofern als solche erstellt) anzeigen, indem Sie Folgendes ausführen:

for i in encoders decoders filters; do
    echo $i:; ffmpeg -hide_banner -${i} | egrep -i "npp|cuvid|nvenc|cuda"
done

Beispielausgabe auf meinem Prüfstand:

encoders:
 V..... h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc                NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_h264           NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_hevc           NVIDIA NVENC hevc encoder (codec hevc)
 V..... hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)
decoders:
 V..... h263_cuvid           Nvidia CUVID H263 decoder (codec h263)
 V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)
 V..... hevc_cuvid           Nvidia CUVID HEVC decoder (codec hevc)
 V..... mjpeg_cuvid          Nvidia CUVID MJPEG decoder (codec mjpeg)
 V..... mpeg1_cuvid          Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)
 V..... mpeg2_cuvid          Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)
 V..... mpeg4_cuvid          Nvidia CUVID MPEG4 decoder (codec mpeg4)
 V..... vc1_cuvid            Nvidia CUVID VC1 decoder (codec vc1)
 V..... vp8_cuvid            Nvidia CUVID VP8 decoder (codec vp8)
 V..... vp9_cuvid            Nvidia CUVID VP9 decoder (codec vp9)
filters:
 ... hwupload_cuda     V->V       Upload a system memory frame to a CUDA device.
 ... scale_npp         V->V       NVIDIA Performance Primitives video scaling and format conversion
林正浩
quelle
1
Gute Antwort! Das ffmpeg-Wiki auf nvenc ist ein wenig veraltet und es fehlen all diese Informationen. Wenn Sie ein paar Minuten Zeit haben, wäre es großartig, wenn Sie Ihr Wissen dort einbringen
slhck
1
danke für die
antwort
Danke für die Rückmeldung. Ich werde dies dem FFmpeg-Wiki hinzufügen.
1.
Ausgabefarbdateien scheinen dunkler, ich erinnere mich, ein Argument kann die gleiche Farbe wie Eingabedatei steuern
Hongducwb
2
vbr_minqpscheint jetzt veraltet zu sein. Ich bin einverstanden, dass diese Antwort missverstanden werden könnte, da es keinen CRF-Modus für gibt h264_nvenc.
Slhck
4

Ich glaube, ich habe eine Lösung gefunden:

ffmpeg -hwaccel auto -i in.mp4 -c:v h264_nvenc -preset llhq -rc constqp -qp 21 -c:a copy out.mp4

Es scheint, dass h264_nvenc -qpanstelle von verwendet -crf. Diese Option funktioniert nur, wenn auf eingestellt -rcist constqp.

Alexander01998
quelle
1
Nein, -qpist jeder anders als -crf. h264_nvenc 's -qpentspricht libx264 ' s-qp
Meow
@Meow Das ist nah genug für mich, aber es ist gut zu wissen, dass es einen Unterschied gibt. Für alle, die dies in Zukunft vielleicht sehen werden, wird auf dieser Seite der Unterschied zwischen CNI und QP erläutert.
Alexander01998
3

Zum -crfErsetzen von libx264 kann -cqoder -qpvon h264_nvenc sein:

-crf Wählen Sie die Qualität für den konstanten Qualitätsmodus

-cq Stellen Sie die Zielqualitätsstufe (0 bis 51, 0 bedeutet automatisch) für den Konstantqualitätsmodus in der VBR-Ratensteuerung ein

-qp Regelungsmethode für konstante Quantisierungsparameterrate (von -1 bis 51) (Standard -1)

Schnellste hardwarebeschleunigte Codierungsmethode:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -resize 640x480 -i input.mp4 -c:v h264_nvenc -cq 21 -c:a copy output.mp4

-resizeAuflösung am Eingang (in Hardware); ffmpeg muss nicht mit --enable-libnppfor scale_nppfilter kompiliert werden.

Für mehr Information:

ffmpeg -h encoder=h264_nvenc

ffmpeg -h denoder=h264_cuvid
ABC
quelle