带有 NVENC 的 FFMpeg 的最佳设置

Dr.*_*ail 45 h.264 mp4 ffmpeg mpeg2

我正在使用我的FFMPEG和我的 GPU ( NVENC ) 的支持将文件从我的卫星接收器(SD、mpeg2 .TS 文件)转换为 h264 .mp4 文件

这是我正在使用的线路

ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
       -qmin 10 -qmax 52 "e:\output.mp4"
Run Code Online (Sandbox Code Playgroud)

但是质量并没有想象中的那么好。并且没有使用我系统的全部功能:

在此处输入图片说明

只有 11% 的 GPU 和 30% 的 CPU 使用率。

问题:我可以做一些改进以通过相同的文件大小提高质量并使用我的 Geforce GTX 1080 的更多计算能力吗?

我从??? 中找到了一些参数 改变但应该已经是最优质的方法了吧?-preset slow

Den*_*gai 69

以下是调整编码器的粗略指南:

我们将从基础开始,因为在不了解预期目标和期望的情况下,迅速得出一系列选项会突然提高预期输出的结论是有害的:

1. 首先了解编码器的选项。

对于基于 NVENC 的编码器,首先了解每个编码器采用的选项(请注意,我使用的是 Linux,这就是为什么我在将编解码器选项粘贴到此处之前使用 xclip 将它们复制到剪贴板的原因):

(一种)。对于 H.264 编码器:

ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip
Run Code Online (Sandbox Code Playgroud)

输出:

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.... 
Run Code Online (Sandbox Code Playgroud)

(b)。对于 HEVC/H.265 编码器:

ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip
Run Code Online (Sandbox Code Playgroud)

输出:

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)
Run Code Online (Sandbox Code Playgroud)

2. 了解硬件的限制,并在应用选项之前首先坚持理智的默认值:

请参阅此答案,了解您在使用 NVENC 时会遇到的硬件限制,尤其是 Pascal 上的 HEVC 编码。可以在此处找到更新和旧版本的当前选项的最新文章。根据您的编码要求进行必要的调整。

有关具有 FFmpeg 的当前一代 NVIDIA 硬件可用的硬件加速基础架构,请参阅答案。

然后,使用该信息,继续下一步。

3. 语法很关键:

以下是您必须将参数传递给 FFmpeg 的顺序:

(一种)。调用二进制文件。

(b)。-loglevel在声明输入之前将任何参数传递给 FFmpeg(例如直接传递给它)。

(C)。如果您正在使用任何硬件加速解码,例如cuvid,请在此处声明它并包含它所需的任何特定参数。在这一点上,必须提到解码器有特定的限制,例如预期的输入分辨率、支持的编解码器等,因此,建议在生产中确定和验证对硬件加速解码器的需求是否为失败在此阶段会导致编码失败且不可恢复。事实上,MPV 开发者已经多次提到这一点,不要依赖硬件加速解码来交付关键任务内容。

(d)。声明您的输入。对于流,使用 URL,如果需要,根据需要添加额外的标志(例如缓冲区大小)。对于本地资源(在可访问的文件系统上),需要绝对文件路径。

(e)。(可选)插入过滤器。这是调整大小、像素格式对话、去隔行等功能所必需的。请注意,根据此处使用的过滤器,基于硬件的解码器(如 (c) 部分所述)将引入您的过滤器必须满足的约束能够处理,否则您的编码将失败。

(F)。调用适当的视频和音频编码器,并将必要的参数传递给它们,例如映射、比特率、编码器预设等。当涉及到比特率时,请确保通过-b:v,-maxrate:v-bufsize:v选项设置所需的值。不要将这些留空。是解释这些值为何重要的一个很好的起点。与往常一样,首先指定一个预设。向下滚动到底部以查看有关此特定编码器预设对性能影响的说明。

(G)。虽然 FFmpeg 可以根据输出文件的选定扩展名推断出所需的文件输出格式,但建议显式声明输出格式(通过 -f 选项),以便在需要时可以将额外选项传递给底层多路复用器,就像 HLS、mpegts 和 DASH 等流媒体格式一样。

(H)。输出文件的绝对路径。

用你上面的例子,引用为:

ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
       -qmin 10 -qmax 52 "e:\output.mp4"
Run Code Online (Sandbox Code Playgroud)

您可以通过指定适当的比特率(通过-b:v,-maxrate:v-bufsize:v设置),启用自适应量化编码技术(支持空间和时间 AQ 方法,一次只能使用一种方法)和可选(和单独)来提高输出质量启用加权预测(这将禁用 B 帧支持)如下所示,以及一个可选的过滤器,用于适当的缩小和调整大小(如果需要)。下面的示例显示了处理以 mpeg2 编码的 mpegts 输入的代码段:

ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v mpeg2_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 \
-spatial_aq:v 1 -aq-strength:v 15 -coder:v cabac \
-f mp4 "e:\output.mp4"
Run Code Online (Sandbox Code Playgroud)

警告:请注意,-weighted_pred不能与自适应和/或空间量化同时启用加权预测 ( )。尝试这样做将导致编码器初始化失败。

关于 NVENC 中的自适应量化实现:请注意,Temporal AQ 会及时重新分配位,因此更复杂的帧将接收更多信息。空间 AQ 在空间中重新分配位,因此帧的更复杂部分将接收更多信息。

上面的代码片段假设输入文件是 MPEG2 流。如果不是这种情况,请在分析后切换到正确的 CUVID 解码器:

ffprobe -i e:\input.ts
Run Code Online (Sandbox Code Playgroud)

如果是'H.264/AVC,修改如下所示的代码片段:

ffmpeg -loglevel debug -threads 1 -hwaccel nvdec \
-hwacccel_output_format cuda -i "e:\input.ts" \
-filter:v "scale_npp=w=1920:h=1080:interp_algo=lanczos" \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -spatial_aq:v 1 \
-aq-strength:v 15 -coder:v cabac \
-f mp4 "e:\output.mp4"
Run Code Online (Sandbox Code Playgroud)

我注意到为 NVENC 启用自适应量化或加权预测选项可能会带来稳定性问题,尤其是特定设备驱动程序组合。在可能的情况下,考虑使用 B 帧(不超过 3 个)和通用选项-refs:v设置为 16 左右,而不是切换 AQ 和加权预测:

ffmpeg -loglevel debug -threads 1 -hwaccel nvdec \
-hwaccel_output_format cuda -i "e:\input.ts" \
-filter:v scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -refs:v 16 \
-bf:v 3 -coder:v cabac \
-f mp4 "e:\output.mp4"
Run Code Online (Sandbox Code Playgroud)

特别是使用Turing,您还可以从启用 B 帧以供参考中受益,如下所示(参见切换-b_ref_mode:v middle)

ffmpeg -loglevel debug -threads 1 -hwaccel cuvid \
-hwaccel_output_format cuda -i "e:\input.ts" \
-filter:v scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -refs:v 16 \
-bf:v 3 -coder:v cabac -b_ref_mode:v middle \
-f mp4 "e:\output.mp4"
Run Code Online (Sandbox Code Playgroud)

关于线程数的额外说明(通过-threads选项传递给 ffmpeg ):

超过特定阈值的更多编码器线程会增加延迟,并且将具有更高的编码内存占用。由于编码延迟增加,在恒定比特率模式和接近恒定比特率模式(称为 VBV(视频缓冲区验证器))中线程数越高,质量下降就越明显。关键帧需要比其他帧类型更多的数据,以避免脉冲质量差的关键帧。

零延迟或切片线程模式没有延迟,但此选项进一步恶化了支持的编码器中的多线程质量。

因此,在延迟很重要的地方限制编码的线程数是明智的,因为感知编码器吞吐量的增加抵消了它可能带来的长期优势。

并且由于您使用的是 Windows,您可能希望删除\上面的 shell 转义,因为我正在从测试上述命令的 Unix 框中编写此内容。

有关预设和隔行编码注意事项的性能影响的说明:

对于高吞吐量、低延迟性能,请确保您使用的是llhpllhq预设。这对于实时流等工作负载最有用,其中预计与更广泛的设备具有更广泛的兼容性,因此,可以完全省略 B 帧等性能削弱功能,以便在更高比特率之间进行良好的权衡使用和吞吐量。较高的预设(例如默认值medium在质量输出方面的回报迅速减少,同时导致编码器吞吐量显着降低。Netflix 的 VMAF衡量的llhp和之间的质量差异llhq 几乎可以忽略不计,但前者的编码器性能提升(在我的测试台上超过约 30%)绝对是可观的。

对于llhpllhq预设以及正在使用的其他预设,您还可以通过传递-rc:v编码器选项公开的参数来覆盖内置的速率控制方法。例如,使用恒定比特率编码,您可以指定-rc:v cbr(这明显快于cbr_ld_hq速率控制方法,为吞吐量带来额外约 20% 的提升)。请注意,所选预设对吞吐量影响最大,其次是预设选项(例如使用的速率控制方法),您可以根据需要选择覆盖这些选项。

在当前构建(为2021+),注意预设与基于使用情况的可调参数进一步定制,通过-tune:v参数,如记录在这里

考虑您的编码工作流程并根据需要进行调整。您的里程肯定会有所不同,具体取决于您的源内容、使用的过滤器链、特定的 pltform 配置变量(例如您的 GPU 和驱动程序版本)等。

同时,请注意 NVIDIA 已明确禁用所有层的图灵隔行编码,即使 1650 使用较旧的 Volta NVENC 编码器。如果您需要隔行编码支持,请改用 Pascal 或更旧的 SKU。

  • 史诗!谢谢,在使用硬件编码这么长时间之后,您会推荐这个而不是CPU编码吗?或者质量/文件大小的缺点仍然那么大吗?我的意思是,NVENC 进行了许多改进,与默认的 x264 相比,NVENC HQ 的质量应该相同 (2认同)

小智 5

我使用 nvenc 的经验是,你需要告诉它你想要什么比特率——它默认为 VBR,这很好,但无论怎样调整,它总是想给你 2M 的平均比特率。你给它提供什么分辨率的文件。这似乎是编码器中的一个缺陷;它在其他方面的表现都符合预期,但它需要(例如)-b:v 4M720p 文件或-b:v 8M1080p 文件。如果你愿意的话,你也可以把它们降低一点。