编码时如何让FFMPEG使用更多GPU

Posted

技术标签:

【中文标题】编码时如何让FFMPEG使用更多GPU【英文标题】:How to get FFMPEG to use more GPU when encoding 【发布时间】:2020-11-26 20:00:56 【问题描述】:

所以情况如下

我每秒接收 20/30 的未压缩图像。格式是 PNG 或位图。每张照片的大小在 40 到 50 mb 之间(在未压缩后都具有相同的大小)。

我想将它们编码为 265 无损视频并使用 FFMPEG 将它们流式传输到 http 服务器。 输出视频是 1920x1080,所以有一些下采样。 允许压缩,但除了下采样外,不允许丢失任何内容。

现在我仍处于测试阶段。我有一个 500 个样本图像。我正在尝试尽可能有效地对它们进行编码。 我正在使用以下命令:

ffmpeg -hwaccel cuvid -f image2 -i "0(%01d).png" -framerate 30 -pix_fmt p010le -c:v hevc_nvenc -preset lossless -rc vbr_hq -b:v 6M -maxrate:v 10M -vf scale=1920:1080 -c:a aac -b:a 240k 结果.mp4

我有一个功能强大的现代 quadro GPU、一个 6 核英特尔 CPU 和一个 Nvme 硬盘。

编码时GPU的使用率正好是10%,CPU大约是30-40%

如何将 GPU 使用率提高到 80%?我要运行代码的机器至少有一个 quadro 4000(可能更强大),我想充分利用它

【问题讨论】:

可能你的磁盘不够快。 【参考方案1】:

如果您的 ffmpeg 是使用 --enable-libnpp 编译的,那么请考虑使用基于 GPU 的 scale_npp 过滤器,而不是仅用于 CPU 的缩放。来自FFmpeg Wiki: Hardware Acceleration的示例:

ffmpeg -hwaccel cuda -i input -vf scale_npp=1920:1080 -c:v h265_nvenc output.mp4

您可能会看到性能或 GPU 利用率有所提高。

【讨论】:

【参考方案2】:

这不是它的工作原理。 GPU 不使用标准矢量处理单元进行视频编码。 (嗯,它对颜色转换和缩放等事情有一点作用,但并非对所有事情都适用)。 GPU 具有用于视频编码原语的专用电路。当这些已满时,无论您拥有多少 GPU 内核,它们都会处于空闲状态。

因此,要使用“更多”GPU,您不会获得强大的 GPU,而是购买具有更多 NVENC 内核的卡。

【讨论】:

好的,当我使用 1920x1080 图像作为输入时,根据任务管理器,FFMPEG 使用了我 GPU 的 30% 的编码资源。当我使用 4000x3000 时,只使用了 10%。我知道我仅限于你所说的 nvenc 核心,但 FFMPEG 使用了其中的一小部分,我不知道如何使用更多。 你不能。您正在使用 100% 的 nvenc 内核。您的工具只是没有报告这一点。 30%/10% 是等待 nvenc 的 GPGPU 内核。这是与阿姆达尔定律相似的现象。 我无法在任何地方找到每张显卡中的 nvenc 内核数量。能否请您给我一个来源。我认为 1000-1500 美元范围内的东西会很棒。 顺便说一句,我没有使用 100% 的 nvenc 内核,我的 ssd 三星 970 PRO 遇到了瓶颈:O 4000x3000 图像太大,将它们放入内存是瓶颈。这就是它设法模拟地获取和写入的所有数据 每个 GPU 上有多少 NVENC 的列表:developer.nvidia.com/…

以上是关于编码时如何让FFMPEG使用更多GPU的主要内容,如果未能解决你的问题,请参考以下文章

如何在ffmpeg中指定nvenc使用的GPU [关闭]

Ubuntu20配置ffmpeg进行gpu硬件加速视频编码记录

Linux FFmpeg h.264 h.265 GPU加速 CUDA加速编码封装分析

Linux FFmpeg h.264 h.265 GPU加速 CUDA加速编码封装方案分析(转载)

如何强制ffmpeg编码时输出一个关键帧

H264编码系列之ffmpeg和x264码率控制分析