将 ffmpeg 编码从 libx264 转换为 h264_nvenc

将 ffmpeg 编码从 libx264 转换为 h264_nvenc

视频托管网站 LBRY建议用户尝试以下命令来压缩上传内容

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

使用 h264_nvenc 而不是 libx264 最接近的等效物是什么?

答案1

尝试这些命令并假设以下条件:

i. NVENC 默认选择的 GPU 是0,并且该 GPU 支持 NVENC。请参阅有关 NVENC 功能的更多信息,包括 FFmpeg 在功能强大的 NVIDIA 硬件上可用的硬件加速基础架构。NVDEC 硬件加速的 GPU 选择通过全局选项切换,-hwaccel_device 0对于编码器,通过h264_nvenc的私有编解码器选项切换-gpu 0。在多 GPU 系统上,选择 列出的有效 GPU nvidia-smi

scale_nppii. 缩放操作使用OR完成scale_cuda,因为它们完全在 GPU 上运行。这些过滤器的可用性取决于如何FFmpeg 已配置,如下所示。有关其可用性,请分别参阅ffmpeg -h filter=scale_nppffmpeg -h filter=scale_cuda

iii. 特定编解码器的硬件加速支持取决于平台和驱动程序。这些可以通过 Philip Langdale 的nv-video-info项目nvdecinfo程序进行验证,如如果你使用的是 Linux,则需要回答这个问题。请注意不是NVDEC 支持所有视频格式,因此将提供基于软件的解码回退功能。

iv. 对于使用的速率控制,我选择了可​​变比特率模式(通过私有编解码器选项设置-rc:v vbr),并将恒定质量参数速率控制设置为值 21。NVENC 的有效值为 0 到 51。比特率通过明确取消设置,以-b:v 0符合 NVENC 中所选速率控制模式的限制。但是,最大比特率和缓冲区大小仍设置为与 中的设置相匹配libx264。请参阅回答为什么选择这些参数。

ffnvcodecv. 根据构建的 FFmpeg 的具体版本和使用的头文件包的版本(即来自发布版本或来自 git master),以下参数将需要更改:(i)。配置了旧发布版本ffnvcodec头文件包的 FFmpeg 旧发布版本的速率控制模式只需要通过 将速率控制选项修改为恒定比特率-rc:v vbr_hq。预设名称保持不变。

(ii). 对于当前从 git 构建的 FFmpeg 与当前 git 版本的ffnvcodec头文件包匹配,则速率控制参数(通过设置rc:v vbr)必须设置为恒定比特率模式,并与命名预设(通过设置-preset:v p{1-7})配对,其中预设范围从p1(最快)到p7(最慢)和有效的调整选项(通过设置-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

ll您可以在 FFmpeg 的命令行中用全名(到)替换调整值lossless,或者通过标识它们的数字(14)替换调整值,如上所示。

h264_nvenc为了您的参考,我将包括编码器包装器的帮助选项打印出来的参数:

  1. 当前 FFmpeg 版本:
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. 较旧的 FFmpeg 版本:
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.... 

现在来看看使用的参数:

1. 使用 FFmpeg 进行全硬件加速解码nvdec

(a)使用文件管理器进行缩放scale_npp,当 FFmpeg 使用专有 CUDA SDK 构建时可用(当标志--enable-nonfree --enable-cuda-nvcc --nvccflags="-gencode arch=compute_52,code=sm_52 -O2"./configure,当使用专有 CUDA SDK 构建 FFmpeg 时可用(当在构建时传递

较旧的版本:

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

当前版本:

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)使用文件管理器进行缩放scale_cuda,当 FFmpeg 构建时,将 clang 后端配置为nvcc生成器llvm(当标志--enable-cuda-llvm --nvccflags="--cuda-gpu-arch=sm_52 -O2"./configure(当在构建时传递

较旧的版本:

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

当前版本:

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. 使用基于软件的解码回退:

请注意,GPU 分配是通过过滤器完成的hwupload_cuda=0,该过滤器会初始化绑定到 GPU 0 的 CUDA HWContext,用于所有缩放操作;对于h264_nvenc编码器包装器,私有选项-gpu:v 0

(a)使用scale_npp过滤器:

较旧的版本:

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

当前版本:

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)使用scale_cuda过滤器:

较旧的版本:

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

当前版本:

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

请进行测试并报告您的发现。

相关内容