我正在使用我的FFMPEG在我的 GPU 的支持下(神经网络)将我的卫星接收器中的文件(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"
但质量不如预期。而且我的系统的全部功能没有得到充分利用:
GPU 使用率仅为 11%,CPU 使用率为 30%。
问:我可以做一些改进,以在保持文件大小不变的情况下提高质量,并充分利用 Geforce GTX 1080 的更多计算能力吗?
答案1
以下是调整编码器的粗略指南:
我们将从基础开始,因为在不了解预期目标和期望的情况下就得出结论“快速推出一系列选项会突然改善预期产出”是有害的:
1. 首先了解编码器的选项。
对于基于 NVENC 的编码器,首先要了解每个编码器所采用的选项(请注意,我在 Linux 上,这就是为什么我使用 xclip 将编解码器选项复制到剪贴板然后再粘贴到这里):
(a)对于 H.264 编码器:
ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip
输出:
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). 对于HEVC/H.265编码器:
ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip
输出:
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. 了解硬件的局限性,在应用选项之前先坚持合理的默认设置:
參閱这个答案了解使用 NVENC 时会遇到的硬件限制,尤其是 Pascal 上的 HEVC 编码。您可以找到更新的描述,其中包含较新和较旧版本的当前选项这里. 根据需要适应您的编码要求。
有关当前一代 NVIDIA 硬件可用的带有 FFmpeg 的硬件加速基础设施,请参阅这回答。
然后,使用该信息继续下一步。
3. 语法至关重要:
以下是向 FFmpeg 传递参数的顺序:
(a). 调用二进制文件。
(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"
您可以通过指定适当的比特率(通过-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"
警告:请注意,加权预测 ( -weighted_pred
) 不能与自适应和/或空间量化同时启用。尝试这样做将导致编码器初始化失败。
关于 NVENC 中的自适应量化实现:请注意,时间 AQ 会随时间重新分配比特,因此更复杂的帧将接收更多信息。空间 AQ 会在空间中重新分配比特,因此帧中更复杂的部分将接收更多信息。
上面的代码片段假设输入文件是 MPEG2 流。如果不是,请在分析后切换到正确的 CUVID 解码器:
ffprobe -i e:\input.ts
如果是 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"
我注意到,为 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"
和图灵,特别是,您还可以受益于启用 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"
关于线程数的额外说明(通过-threads
选项传递给 ffmpeg):
超过特定阈值的编码器线程数会增加延迟,并且编码内存占用也会更高。由于编码延迟增加,在恒定比特率模式和近恒定比特率模式(称为 VBV(视频缓冲区验证器))中,线程数越多,质量下降越明显。关键帧需要比其他帧类型更多的数据,以避免脉冲质量较差的关键帧。
零延迟或切片线程模式没有延迟,但是此选项会进一步降低支持的编码器中的多线程质量。
因此,在延迟很重要的编码中限制线程数是明智的,因为感知到的编码器吞吐量增加会抵消它可能在长期带来的任何优势。
而且由于您使用的是 Windows,您可能需要删除\
上面的 shell 转义,因为我是在 Unix 机器上测试上述命令时编写此内容的。
有关预设和隔行编码注意事项对性能的影响的说明:
为了获得高吞吐量、低延迟性能,请确保使用llhp
或llhq
预设。这对于直播等工作负载最有用,因为需要与更多种类的设备具有更广泛的兼容性,因此可以完全省略 B 帧等性能削弱功能,以在使用的更高比特率和吞吐量之间实现良好的平衡。更高的预设(例如默认的medium
)具有质量收益迅速下降输出,同时导致编码器吞吐量显著降低。llhp
和之间的质量差异llhq
由Netflix 的 VMAF几乎可以忽略不计,但使用前者,编码器的性能提升(在我的测试平台上超过~30%)绝对是值得赞赏的。
对于llhp
和llhq
预设以及其他正在使用的预设,您还可以通过传递-rc:v
编码器选项公开的参数来覆盖内置的速率控制方法。例如,使用恒定比特率编码,您可以指定-rc:v cbr
(这比速率控制方法快得多cbr_ld_hq
,可将吞吐量额外提高约 20%)。请注意所选的预设对吞吐量影响最大,后面跟着预设选项(例如正在使用的速率控制方法),您可以根据需要选择覆盖这些选项。
在当前版本中(截至 2021 年及以后),请注意,预设可以根据用例通过参数使用可调参数进一步自定义,-tune:v
如文档所述这里。
考虑您的编码工作流程并根据需要进行调整。您的里程肯定会有所不同,具体取决于您的源内容、使用的过滤器链、特定平台配置变量(例如您的 GPU 和驱动程序版本)等。
同时,请注意 NVIDIA 已经在 Turing 上明确禁用隔行编码在所有层级中,即使 1650 也使用较旧的 Volta NVENC 编码器。如果您需要隔行编码支持,请改用 Pascal 或较旧的 SKU。
答案2
我使用 nvenc 的经验是,您需要告诉它您想要的比特率——它默认为 VBR,这很好,但无论你输入什么分辨率的文件,它总是想给你一个 2M 的平均比特率。这似乎是编码器的一个缺陷;它在其他所有方面的表现都是可预测的,但它需要(例如)-b:v 4M
720p 文件或-b:v 8M
1080p。如果你愿意的话,你也可以稍微降低这些值。
答案3
用于音频的 Libvorbis 似乎很慢。ac3 应该能让你的速度提高 15% 以上。
也就是说,您的视频驱动程序有问题,或者您使用的是旧版 ffmpeg。q 我没有您的剪辑,但我从我的 PVR 中抓取了一个 SD ts 文件,并使用了您的设置。
我在 GTX750(非 TI)(较便宜的一款)上获得了 700fps(您的设置)
我得到了 925fps(您的设置与 ac3 音频)
我可以提出的另一个建议是:
将您的 qmax 改为大约 23。
答案4
在这里回答: hevc_nvenc 选项信息
ffmpeg -strict 2 -hwaccel auto -i "inputfile.mp4" -c:v hevc_nvenc -rc vbr -cq 24 -qmin 24 -qmax 24 -profile:v main10 -pix_fmt p010le -b:v 0K -c:a aac -map 0 "outputfile.mp4"