在运行 16.04 的相当旧的笔记本电脑上,每当我尝试使用 ffmpeg 时都会出现以下错误:
$ ffmpeg
ffmpeg: error while loading shared libraries: libcudart.so.5.5: cannot open shared object file: No such file or directory
ffmpeg 以前运行良好,但后来出现故障。我不确定具体是什么时候,但可能是在我从 14.04 升级到 16.04 时。
运行 ldd 确认缺少此库(CUDA 运行时库),但其他一切正常:
$ ldd /usr/bin/ffmpeg | grep libcudart
libcudart.so.5.5 => not found
我相当确定该文件 (libcudart5.5) 不存在于我的系统中的任何地方(我尝试过“查找”等),或者实际上不存在任何其他版本的 libcudart。repo 中最接近我需要的是 libcudart7.5,这是更高版本。但这伴随着 nvidia 驱动程序升级(nvidia-367)作为依赖项,我发现它已经多次导致整个系统崩溃(我认为是因为显卡有点过时)。
所以基本上我很困惑为什么 ffmpeg 首先要尝试链接到 libcudart5.5。当然,在不需要 GPU 支持的情况下运行 ffmpeg 是可能的吗?事实上,我知道这是因为在我使用的另一台运行 16.04 的计算机上,ldd 显示不依赖任何版本的 libcudart,并且 ffmpeg 运行良好。两种情况下 ffmpeg 包的版本相同:
$ dpkg -s ffmpeg | grep Version
Version: 7:2.8.11-0ubuntu0.16.04.1
那么为什么它会在我的笔记本电脑上寻找它呢?我尝试过多次清除 ffmpeg 并重新安装它,但都没有成功。有一件似乎相关的事情是,我发现residual-config
我的系统上安装了一个名为 libcudart5.5 的包。我真的不知道这意味着什么,但在删除它并重新安装 ffmpeg 后,它并没有什么不同。在某个阶段(在 14.04 下)我安装了完整的 CUDA sdk,但后来完全删除了它并且不想重新安装它,这可能也是相关的。
我真的很感激任何帮助,因为我真的很想在我的笔记本电脑上使用 ffmpeg 进行视频转换,而这已经困扰我有一段时间了。
谢谢!
答案1
我在对 ridgy 对原始问题的评论进行一些调查后回答了自己的问题(谢谢!)。我开始探索 ffmpeg 使用的其他库是否将 libcudart 作为依赖项。lddtree
包中的工具pax-utils
对此非常有用,因为它为您提供了链接器依赖项的层次结构列表,而不是平面列表。例如
$ lddtree /usr/bin/ffmpeg
使用这个,我发现这libcudart.so.5.5
是一个链接器依赖libopencv_core.so.2.4
项,它在我从源代码编译 OpenCV 2.4 时就遗留了下来/usr/local/lib
,并且在新版本(版本 3.0)出现时从未清理过。
为了解决这个问题,我卸载了ffmpeg
所有使用 apt 的软件包,然后手动删除了使用opencv
中剩余的 opencv 2.4 文件/usr/local/lib
$ sudo rm /usr/local/lib/libopencv_*.so.2.4*
然后从 repo 重新安装 ffmpeg,现在一切正常。
这似乎是一组相当特殊的情况,可能与其他人不太相关,但也许这个答案对有类似问题的人有用。
答案2
我遇到了类似的问题。我通过删除 opencv 和 ffmpeg 的所有实例、卸载 ffmpeg,然后再次安装它来解决它:
sudo find / -name "*opencv*" -exec rm -R {} \;
sudo find / -name "*ffmpeg*" -exec rm -R {} \;
sudo apt-get install ffmpeg
答案3
运行ffmpeg
以查看缺少了什么。尝试找到它的位置libopencv_core.so.2.4
(或缺少的任何文件)。例如:
find / -name "*libopencv_core.so*"
如果你在某个目录中找到它,将其复制到/usr/lib/
:
sudo cp /path-where-you-found-it/ /usr/lib/
最后再跑一次ffmpeg
。
如果一切正常,它将显示帮助选项。