语境
我最近将 nVidia 驱动程序更新至 375.26,并在我的计算机上重新编译了 FFmpeg N-83180-gcf3affa 和 OBS 17.0.2-5-g43e4a2e(抱歉,如果这些数字没有任何意义,我不太确定哪些版本号是重要的) Debian 机器。对 RAM 进行挂起将导致 OBS 停止工作,唯一的修复方法是重新启动计算机。
如何重现
- 运行OBS
输出配置:
- 将输出设置为 NVENC H.264 和 .mp4
- 使用CBR
- 比特率 = 200K
- Kf 间隔 = 0
- 低延迟、高质量预设、主、自动
- 启用 2 遍编码
- 显卡 = 0
- B 帧 = 0
开始录制并停止以确认其正常工作
- 转到登录操作并单击暂停
- 重新开机并登录
开始录制,OBS失败并出现以下错误:
[h264_nvenc @ 0x3fdd1e0] Failed creating CUDA context for NVENC: 0x3e7 [h264_nvenc @ 0x3fdd1e0] No NVENC capable devices found
系统信息
- 上面列出的驱动程序/软件版本
- 显卡:微星GTX 970
- uname -a:Linux 版本 3.16.0-4-amd64,#1 SMP Debian 3.16.39-1 (2016-12-30)
- 操作系统:Debian 8.7 杰西
如果 XFCE 4.10 对操作按钮的工作方式有影响,我会使用它。
问题
有什么方法可以避免每次重新启动以避免唤醒计算机后出现此错误?
编辑1
我知道OBS是这个问题的根源。
测试用例1:
- 启动电脑,使用ffmpeg的h264_nvenc编码器输出视频文件
- 挂起至 RAM
- 登录,成功重复步骤1
测试案例2:
- 启动电脑,使用OBS使用h264_nvenc录制视频
- 辞职OBS
- 挂起至 RAM
- 登录,成功重复步骤2
测试用例3:
- 启动电脑,使用OBS用h264_nvenc录制视频
- 挂起至 RAM
- 登录,失败并显示
Cannot init CUDA
我的猜测是,当录制停止时,OBS 不会关闭其流,它可能会出于性能(?)原因而保留,直到您退出程序?我不知道如何解决这个问题。一旦出现错误,重新启动OBS将不起作用,必须重新启动系统。
看起来 GPU 完全可以很好地处理其他所有任务,尽管如此glxinfo
,nvidia-smi
所有nvidia-settings
这些都证实 GPU 确实被用来处理其他任务。看来 NVENC 是挂起到 RAM 后唯一出现问题的地方。
编辑2
以下是dmesg
日志:https://www.diffchecker.com/wto7KPJZ
选项卡式“原始”是在执行暂停后发生的更改,选项卡式“更改”是在执行我建议的修复后发生的更改。
答案1
如果在将系统挂起之前启动(并停止,但这不是必需的)h264_nvenc 流,FFmpeg 仅锁定 CUDA init。如果OBS在挂起之前从未使用h264_nvenc编码器记录任何内容,那么当您再次登录时它会正常工作。
如果OBS在登录后锁定,则可以通过以下方式使用:
- 退出OBS
在终端中运行:
sudo rmmod nvidia_uvm && sudo modprobe nvidia_uvm
再次打开OBS
- ???
- 利润
如果卸载nvidia_uvm
不起作用,DRM 和模式集模块可能也需要重新加载,尽管我从未遇到过这个问题。