我正在使用 NVIDIA Quadro P620。
我曾多次使用 ffmpeg 通过 GPU 进行转码,使用以下命令
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.avi -c:v h264_nvenc output.mp4
然后 ffmpeg 停止转码并告诉我:
No decoder surfaces left
似乎 GPU 内存已满且未释放。如果我删除-hwaccel_output_format cuda选项后,转码将再次有效。
如何刷新 GPU 内存?如何在 Windows 10 中管理 GPU 内存?
答案1
这看起来像是一个已知的错误:
#7562 使用 -hwaccel nvdec 打开缺陷会产生“无解码器表面剩余”现象,且带有隔行输入和 3 个或更多 b 帧。
这篇文章中提出的解决方法是:
- 添加参数
-extra_hw_frames 3
- 使用过滤器
scale_cuda
或yadif_cuda
。
答案2
尝试增强上述解决方案。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -extra_hw_frames 5 -i input.mp4 -c:v h264_nvenc -b:v 5M output.mp4
我们需要在 hwaccel 输出格式后添加所需的额外线程。如果你在输入后粘贴它,你可能会得到Codec AVOption extra_hw_frames (Number of extra hardware frames to allocate for the user)
您可以根据机器使用 extra_hw_frames。
答案3
这是由于默认的 b 帧数量从 0 变为自动(即 -1)所导致的。发生在这里:https://github.com/FFmpeg/FFmpeg/commit/a0949d0bcb0eee2f3fffcf9a4810c0295d14c0dc
解决方法是在 -c:v h264_nvenc 之后使用 -bf 0 或者在输入之前添加 -extra_hw_frames 5 或更多或者从 -hwaccel cuda 中删除一些线程(线程是这里的另一个错误:https://trac.ffmpeg.org/ticket/8948#comment:4)。
https://trac.ffmpeg.org/ticket/7562是专门针对去隔行内容的,它似乎已经修复。