Konvertieren Sie die ffmpeg-Kodierung von libx264 in h264_nvenc

Konvertieren Sie die ffmpeg-Kodierung von libx264 in h264_nvenc

Die Video-Hosting-Website LBRYschlägt vor, dass Benutzer den folgenden Befehl verwenden, um ihre Uploads zu komprimieren:

ffmpeg -i input.avi -c:v libx264 -crf 21 -preset faster -pix_fmt yuv420p -maxrate 5000K -bufsize 5000K -vf 'scale=if(gte(iw\,ih)\,min(1920\,iw)\,-2):if(lt(iw\,ih)\,min(1920\,ih)\,-2)' -movflags +faststart -c:a aac -b:a 160k output.mp4

Was wäre das nächste Äquivalent bei Verwendung von h264_nvenc anstelle von libx264?

Antwort1

Probieren Sie diese Befehle unter folgenden Annahmen aus:

i. Die für NVENC ausgewählte Standard-GPU ist 0und dass die GPU NVENC-fähig ist. SieheDasWeitere Informationen zu den NVENC-Funktionen, einschließlich der für FFmpeg auf leistungsfähiger NVIDIA-Hardware verfügbaren Hardwarebeschleunigungsinfrastruktur. Die GPU-Auswahl mit NVDEC-Hardwarebeschleunigung wird über die globale Option -hwaccel_device 0und für den Encoder über h264_nvencdie private Codec-Option umgeschaltet -gpu 0. Wählen Sie auf einem System mit mehreren GPUs eine gültige GPU aus, die unter aufgeführt ist nvidia-smi.

ii. Skalierungsoperationen werden entweder mit scale_nppOR durchgeführt scale_cuda, da diese ausschließlich auf der GPU ausgeführt werden. Die Verfügbarkeit dieser Filter hängt ab vonWieFFmpeg wurde wie unten beschrieben konfiguriert. Informationen zur Verwendbarkeit finden Sie ffmpeg -h filter=scale_nppunter bzw. ffmpeg -h filter=scale_cuda.

iii. Die Hardwarebeschleunigungsunterstützung für bestimmte Codecs ist plattform- und treiberabhängig. Dies kann mit dem Programm des nv-video-infoProjekts von Philip Langdale überprüft werden nvdecinfo, wie in dokumentiertDasAntwort, wenn Sie Linux verwenden. Beachten Sie, dassnichtAlle Videoformate werden von NVDEC unterstützt und daher wird ein Fallback auf softwarebasierte Dekodierung bereitgestellt.

iv. Für die verwendete Ratensteuerung habe ich den variablen Bitratenmodus (eingestellt über die private Codec-Option -rc:v vbr) mit konstantem Qualitätsparameter „Ratensteuerung“ auf einen Wert von 21 eingestellt. Gültige Werte für NVENC sind 0 bis 51. Die Bitrate wird explizit über aufgehoben, um -b:v 0den Beschränkungen des ausgewählten Ratensteuerungsmodus in NVENC zu entsprechen. Die maximale Bitrate und die Puffergröße(n) bleiben jedoch so eingestellt, dass sie Ihren Einstellungen in entsprechen libx264. SieheDasAntwort darauf, warum diese Parameter ausgewählt wurden.

v. Abhängig von der konkreten Version des erstellten FFmpeg und der Version des ffnvcodecverwendeten Header-Pakets, also entweder von einer Release-Version ODER von Git Master, müssen die folgenden Parameter geändert werden: (i). Der Ratenkontrollmodus für ältere Release-Builds von FFmpeg, die mit älteren Release-Versionen von ffnvcodecHeader-Paketen konfiguriert sind, erfordert nur die Änderung der Ratenkontrolloption auf konstante Bitrate über -rc:v vbr_hq. Die voreingestellten Namen bleiben unverändert.

(ii). Für aktuelle FFmpeg-Builds aus Git, die mit der aktuellen Git-Version des ffnvcodecHeader-Pakets übereinstimmen, müssen die Parameter für die Ratensteuerung (eingestellt über rc:v vbr) auf den konstanten Bitratemodus eingestellt werden, gepaart mit einer benannten Voreinstellung (über ), wobei die Voreinstellung von (am schnellsten) bis (am langsamsten) -preset:v p{1-7}reicht , und einer gültigen Tuning-Option (eingestellt über ), wobei der Wert zwischen folgenden Werten liegt:p1p7-tune:v

hq              1            E..V...... High quality
ll              2            E..V...... Low latency
ull             3            E..V...... Ultra low latency
lossless        4            E..V...... Lossless

Sie können die Tuningwerte in den Befehlszeilen von FFmpeg durch vollständige Namen ( llbis ) oder durch die sie identifizierenden Nummern ( bis ) ersetzen, wie oben gezeigt.lossless14

Zu Ihrer Information füge ich die Parameter ein, die die h264_nvencHilfeoption des Encoder-Wrappers ausgibt:

  1. Aktuelle FFmpeg-Builds:
ffmpeg -h encoder=h264_nvenc

Encoder h264_nvenc [NVIDIA NVENC H.264 encoder]:
    General capabilities: delay hardware 
    Threading capabilities: none
    Supported hardware devices: cuda cuda 
    Supported pixel formats: yuv420p nv12 p010le yuv444p p016le yuv444p16le bgr0 rgb0 cuda
h264_nvenc AVOptions:
  -preset            <int>        E..V...... Set the encoding preset (from 0 to 18) (default p4)
     default         0            E..V...... 
     slow            1            E..V...... hq 2 passes
     medium          2            E..V...... hq 1 pass
     fast            3            E..V...... hp 1 pass
     hp              4            E..V...... 
     hq              5            E..V...... 
     bd              6            E..V...... 
     ll              7            E..V...... low latency
     llhq            8            E..V...... low latency hq
     llhp            9            E..V...... low latency hp
     lossless        10           E..V...... 
     losslesshp      11           E..V...... 
     p1              12           E..V...... fastest (lowest quality)
     p2              13           E..V...... faster (lower quality)
     p3              14           E..V...... fast (low quality)
     p4              15           E..V...... medium (default)
     p5              16           E..V...... slow (good quality)
     p6              17           E..V...... slower (better quality)
     p7              18           E..V...... slowest (best quality)
  -tune              <int>        E..V...... Set the encoding tuning info (from 1 to 4) (default hq)
     hq              1            E..V...... High quality
     ll              2            E..V...... Low latency
     ull             3            E..V...... Ultra low latency
     lossless        4            E..V...... Lossless
  -profile           <int>        E..V...... Set the encoding profile (from 0 to 3) (default main)
     baseline        0            E..V...... 
     main            1            E..V...... 
     high            2            E..V...... 
     high444p        3            E..V...... 
  -level             <int>        E..V...... Set the encoding level restriction (from 0 to 62) (default auto)
     auto            0            E..V...... 
     1               10           E..V...... 
     1.0             10           E..V...... 
     1b              9            E..V...... 
     1.0b            9            E..V...... 
     1.1             11           E..V...... 
     1.2             12           E..V...... 
     1.3             13           E..V...... 
     2               20           E..V...... 
     2.0             20           E..V...... 
     2.1             21           E..V...... 
     2.2             22           E..V...... 
     3               30           E..V...... 
     3.0             30           E..V...... 
     3.1             31           E..V...... 
     3.2             32           E..V...... 
     4               40           E..V...... 
     4.0             40           E..V...... 
     4.1             41           E..V...... 
     4.2             42           E..V...... 
     5               50           E..V...... 
     5.0             50           E..V...... 
     5.1             51           E..V...... 
     5.2             52           E..V...... 
     6.0             60           E..V...... 
     6.1             61           E..V...... 
     6.2             62           E..V...... 
  -rc                <int>        E..V...... Override the preset rate-control (from -1 to INT_MAX) (default -1)
     constqp         0            E..V...... Constant QP mode
     vbr             1            E..V...... Variable bitrate mode
     cbr             2            E..V...... Constant bitrate mode
     vbr_minqp       8388612      E..V...... Variable bitrate mode with MinQP (deprecated)
     ll_2pass_quality 8388616      E..V...... Multi-pass optimized for image quality (deprecated)
     ll_2pass_size   8388624      E..V...... Multi-pass optimized for constant frame size (deprecated)
     vbr_2pass       8388640      E..V...... Multi-pass variable bitrate mode (deprecated)
     cbr_ld_hq       8388616      E..V...... Constant bitrate low delay high quality mode
     cbr_hq          8388624      E..V...... Constant bitrate high quality mode
     vbr_hq          8388640      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             -1           E..V...... Pick the first device available
     list            -2           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)
  -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)
  -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         -1           E..V...... 
     auto            0            E..V...... 
     cabac           1            E..V...... 
     cavlc           2            E..V...... 
     ac              1            E..V...... 
     vlc             2            E..V...... 
  -b_ref_mode        <int>        E..V...... Use B frames as references (from 0 to 2) (default disabled)
     disabled        0            E..V...... B frames will not be used for reference
     each            1            E..V...... Each B frame will be used for reference
     middle          2            E..V...... Only (number of B frames)/2 will be used for reference
  -a53cc             <boolean>    E..V...... Use A53 Closed Captions (if available) (default true)
  -dpb_size          <int>        E..V...... Specifies the DPB size used for encoding (0 means automatic) (from 0 to INT_MAX) (default 0)
  -multipass         <int>        E..V...... Set the multipass encoding (from 0 to 2) (default disabled)
     disabled        0            E..V...... Single Pass
     qres            1            E..V...... Two Pass encoding is enabled where first Pass is quarter resolution
     fullres         2            E..V...... Two Pass encoding is enabled where first Pass is full resolution
  -ldkfs             <int>        E..V...... Low delay key frame scale; Specifies the Scene Change frame size increase allowed in case of single frame VBV and CBR (from 0 to 255) (default 0)

  1. Ältere FFmpeg-Builds:
ffmpeg -h encoder=h264_nvenc

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.... 

Und nun zu den verwendeten Parametern:

1. Verwenden von FFmpeg mit vollständig hardwarebeschleunigter Dekodierung über nvdec:

(a). Die Skalierung erfolgt mit dem scale_nppFiler, verfügbar, wenn FFmpeg mit dem proprietären CUDA SDK erstellt wird (wenn die Flags zur Build-Zeit --enable-nonfree --enable-cuda-nvcc --nvccflags="-gencode arch=compute_52,code=sm_52 -O2"übergeben werden ./configure):

Ältere Builds:

ffmpeg -threads 1 -hwaccel nvdec -hwaccel_device 0 -hwaccel_output_format cuda -i input.avi \
-vf 'scale_npp=w=1920:h=1080:interp_algo=lanczos' -c:v h264_nvenc \
-gpu:v 0 -cq:v 21 -rc:v vbr -preset:v fast \
-b:v 0 -maxrate:v 5000K -bufsize:v 5000K -c:a aac -b:a 160k -movflags +faststart -f mp4 output.mp4

Aktuelle Builds:

ffmpeg -threads 1 -hwaccel nvdec -hwaccel_device 0 -hwaccel_output_format cuda -i input.avi \
-vf 'scale_npp=w=1920:h=1080:interp_algo=lanczos' -c:v h264_nvenc \
-gpu:v 0 -cq:v 21 -rc:v vbr -tune:v ll -preset:v p1 \
-b:v 0 -maxrate:v 5000K -bufsize:v 5000K -c:a aac -b:a 160k -movflags +faststart -f mp4 output.mp4

(b). Die Skalierung erfolgt mit dem Filer, der verfügbar ist, wenn FFmpeg mit dem als Generator scale_cudakonfigurierten Clang-Backend erstellt wird (wenn die Flags zur Build-Zeit übergeben werden ):nvccllvm--enable-cuda-llvm --nvccflags="--cuda-gpu-arch=sm_52 -O2"./configure

Ältere Builds:

ffmpeg -threads 1 -hwaccel nvdec -hwaccel_device 0 -hwaccel_output_format cuda -i input.avi \
-vf 'scale_cuda=w=1920:h=1080' -c:v h264_nvenc \
-gpu:v 0 -cq:v 21 -rc:v vbr -preset:v fast \
-b:v 0 -maxrate:v 5000K -bufsize:v 5000K -c:a aac -b:a 160k -movflags +faststart -f mp4 output.mp4

Aktuelle Builds:

ffmpeg -threads 1 -hwaccel nvdec -hwaccel_device 0 -hwaccel_output_format cuda -i input.avi \
-vf 'scale_cuda=w=1920:h=1080' -c:v h264_nvenc \
-gpu:v 0 -cq:v 21 -rc:v vbr -tune:v ll -preset:v p1 \
-b:v 0 -maxrate:v 5000K -bufsize:v 5000K -c:a aac -b:a 160k -movflags +faststart -f mp4 output.mp4

2. Verwenden eines softwarebasierten Dekodierungs-Fallbacks:

Beachten Sie, dass die GPU-Zuweisung über den Filter erfolgt hwupload_cuda=0, der für alle Skalierungsvorgänge einen an GPU 0 gebundenen CUDA HWContext initialisiert, und dass für den h264_nvencEncoder-Wrapper die private Option -gpu:v 0folgt.

(a). Verwenden des scale_nppFilters:

Ältere Builds:

ffmpeg -threads 2 -i input.avi -vf 'hwupload_cuda=0,scale_npp=w=1920:h=1080:interp_algo=lanczos' \
-c:v h264_nvenc -gpu:v 0 -cq:v 21 -rc:v vbr -preset:v fast -b:v 0 \
-maxrate:v 5000K -bufsize:v 5000K -c:a aac -b:a 160k -movflags +faststart -f mp4 output.mp4

Aktuelle Builds:

ffmpeg -threads 2 -i input.avi -vf 'hwupload_cuda=0,scale_npp=w=1920:h=1080:interp_algo=lanczos' \
-c:v h264_nvenc -gpu:v 0 -cq:v 21 -rc:v vbr -tune:v ll -preset:v p1 -b:v 0 \
-maxrate:v 5000K -bufsize:v 5000K -c:a aac -b:a 160k -movflags +faststart -f mp4 output.mp4

(b). Verwenden des scale_cudaFilters:

Ältere Builds:

ffmpeg -threads 2 -i input.avi -vf 'hwupload_cuda=0,scale_cuda=w=1920:h=1080' \
-c:v h264_nvenc -gpu:v 0 -cq:v 21 -rc:v vbr -preset:v fast -b:v 0 \
-maxrate:v 5000K -bufsize:v 5000K -c:a aac -b:a 160k -movflags +faststart -f mp4 output.mp4

Aktuelle Builds:

ffmpeg -threads 2 -i input.avi -vf 'hwupload_cuda=0,scale_cuda=w=1920:h=1080' \
-c:v h264_nvenc -gpu:v 0 -cq:v 21 -rc:v vbr -tune:v ll -preset:v p1 -b:v 0 \
-maxrate:v 5000K -bufsize:v 5000K -c:a aac -b:a 160k -movflags +faststart -f mp4 output.mp4

Testen Sie es bitte und berichten Sie uns von Ihren Ergebnissen.

verwandte Informationen