使用 nvidia/cuda 编译 ffmpeg 加载 nvcuvid 失败

Posted

技术标签:

【中文标题】使用 nvidia/cuda 编译 ffmpeg 加载 nvcuvid 失败【英文标题】:compiling ffmpeg with nvidia/cuda failed loading nvcuvid 【发布时间】:2019-01-20 20:15:55 【问题描述】:

我正在尝试编译支持使用 nvidia GPU 的 ffmpeg 二进制文件,我正在运行:

os: ubuntu 18.04
nvidia driver: nvidia-driver-390
cat /usr/local/cuda-9.0/version.txt => CUDA Version 9.0.176
gpu: 2x 1080ti

根据https://developer.nvidia.com/ffmpeg 上显示的说明,是:

git clone https://git.ffmpeg.org/ffmpeg.git
cd ffmpeg
./configure --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64

我首先发现了错误ERROR: cuda requested, but not all dependencies are satisfied: ffnvcodec,在https://superuser.com/questions/1299064/error-cuvid-requested-but-not-all-dependencies-are-satisfied-cuda-ffnvcodec 的帮助下得到了解决。以下是摘要(make 和 make install 只是给出了要运行的命令列表):

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers
sed 's#@@PREFIX@@#/usr/local#' ffnvcodec.pc.in > ffnvcodec.pc
sudo install -m 0755 -d '/usr/local/include/ffnvcodec'
sudo install -m 0644 include/ffnvcodec/*.h '/usr/local/include/ffnvcodec'
sudo install -m 0755 -d '/usr/local/lib/pkgconfig'
sudo install -m 0644 ffnvcodec.pc '/usr/local/lib/pkgconfig'

完成后,我删除了 ffmpeg 文件夹,重新克隆它并在该文件夹中运行:

./configure --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda-9.0/include --extra-ldflags=-L/usr/local/cuda-9.0/lib64
make -j 10

请注意,路径 /usr/local/cuda-9.0 确实包含 include 和 lib64 文件夹,这不会导致任何错误,只是会出现弃用警告。

现在,当使用绝对路径运行这个特定的 ffmpeg 二进制文件时,使用标志 -hwaccel cuvid 会导致:

~/Documents/ffmpeg-cuda/ffmpeg/ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -vsync 0 -i ~/test.mp4 -vf "scale_npp=1920:1072" -vcodec h264_nvenc ~/out1.mp4 -vf scale_npp=1280:720 -vcodec h264_nvenc out2.mp4

这正是他们在他们的网站上测试它的结果:

[h264_cuvid @ 0x556348eb94c0] Cannot load cuvidGetDecodeStatus
[h264_cuvid @ 0x556348eb94c0] Failed loading nvcuvid.

我在./configure之前也加了:PKG_CONFIG_PATH="/usr/local/lib/pkgconfig",但也没什么区别。

我做错了什么?我错过了什么重要的事情吗?

【问题讨论】:

【参考方案1】:

使用 ffmpeg 存储库 https://github.com/FFmpeg/nv-codec-headers,即 “与 Nvidia 编解码器 API 接口所需的 FFmpeg 版本的标头”,我看到了 Linux 需要 “396.24 或更高版本的事实司机”。并且至少只有 CUDA 工具包 9.2 支持此驱动程序版本。所以,我使用命令的顺序我已经忘记了,但大致如下所示,以便删除 nvidia 驱动程序和 cuda 软件;

sudo apt remove cuda
sudo aot-get autoremove --purge cuda
cd /var
# Here I removed files like cuda-repo-9-0-local-xxx
cd /etc/apt/sources.list.d
# Here I removed files like cuda-9-0-xxx.list/save

现在使用 GUI 软件和更新,在附加驱动选项卡中,有时不允许我从 390 更改为 396,所以我很确定我先更改为 Nouveau 显示驱动程序,重新启动计算机,然后选择 396 NVIDIA驱动程序(开源),再次重新启动计算机,然后现在使用 396,检查 nvidia-smi 显示 396.51。

然后我去了https://developer.nvidia.com/cuda-downloads并下载了 9.2 Linux Ubuntu 17.04 .deb 文件然后:

wget https://developer.nvidia.com/compute/cuda/9.2/Prod2/local_installers/cuda-repo-ubuntu1710-9-2-local_9.2.148-1_amd64
mv cuda-repo-ubuntu1710-9-2-local_9.2.148-1_amd64 cuda-repo-ubuntu1710-9-2-local_9.2.148-1_amd64.deb
sudo dpkg -i --force-overwrite cuda-repo-ubuntu1710-9-2-local_9.2.148-1_amd64.deb
sudo apt-key add /var/cuda-repo-9-2-local/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda

现在安装了带有 nvidia-drvier 版本 396.51 的 CudaToolKit 9.2,重新执行我的问题中发布的步骤,在使用 -hwaccel cuvid 运行 ffmpeg 时没有错误。顺便说一句,这会产生 MASSIVE 的不同!

【讨论】:

哇,谢谢你,我从 ffmpeg 收到的错误消息非常具有误导性。我在 debian/unstable 上,nvidia 的 396.52 仍处于试验阶段,apt install -t experimental nvidia-kernel-dkms nvidia-cuda-dev,重启,重建 ffmpeg 并启用 cuda,你应该一切顺利。

以上是关于使用 nvidia/cuda 编译 ffmpeg 加载 nvcuvid 失败的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow/nvidia/cuda docker 版本不匹配

nvidia cuda访问gpu共享内存

markdown 使用NVIDIA CUDA support.md在OSX上构建张量流

nVIDIA CUDA 驱动程序究竟做了啥?

torch.cuda.is_avaiable 在 nvidia-smi 不工作的情况下返回 False

sh nvidia cuda的东西