0
点赞
收藏
分享

微信扫一扫

解决Hostease部署ComfyUI之FFmpeg依赖问题的完整案例

这两天,在为客户提供技术支持时,我遇到了一个涉及 ComfyUI 和 FFmpeg 的棘手问题。用户之前使用的是 Godaddy 但是这两年AI热度居高不下,但是Godaddy仍然没有提供GPU的高配置服务器,所以他在朋友的推荐下选择在 Hostease 购买了一台配有 RTX4090 的服务器部署 ComfyUI。但是部署中遇到了加载 FFmpeg 时的错误,从 FFmpeg4 到 FFmpeg6,各种版本几乎都报错了。这显然是由于缺少相应的 FFmpeg 库文件,或者版本不兼容的问题。

硬件配置

在开始解决问题之前,我先对服务器的硬件性能进行了评估,客户的这台Hostease的机器硬件性能非常优秀,NVMe的读写速度1911.5 MB/s:

解决Hostease部署ComfyUI之FFmpeg依赖问题的完整案例_bootstrap

报错信息复现与分析

复现用户的问题后,以下是客户遇到的完整报错信息:

Loading FFmpeg6
Failed to load FFmpeg6 extension.
Traceback (most recent call last):
File "/home/pd/.local/lib/python3.10/site-packages/torio/_extension/utils.py", line 116, in _find_ffmpeg_extension
ext = _find_versionsed_ffmpeg_extension(ffmpeg_ver)
File "/home/pd/.local/lib/python3.10/site-packages/torio/_extension/utils.py", line 108, in _find_versionsed_ffmpeg_extension
_load_lib(lib)
File "/home/pd/.local/lib/python3.10/site-packages/torio/_extension/utils.py", line 94, in _load_lib
torch.ops.load_library(path)
File "/home/pd/.local/lib/python3.10/site-packages/torch/_ops.py", line 1295, in load_library
ctypes.CDLL(path)
File "/usr/lib/python3.10/ctypes/__init__.py", line 374, in __init__
self._handle = _dlopen(self._name, mode)
OSError: libavutil.so.58: cannot open shared object file: No such file or directory
Loading FFmpeg5
Failed to load FFmpeg5 extension.
Traceback (most recent call last):
File "/home/pd/.local/lib/python3.10/site-packages/torio/_extension/utils.py", line 116, in _find_ffmpeg_extension
ext = _find_versionsed_ffmpeg_extension(ffmpeg_ver)
File "/home/pd/.local/lib/python3.10/site-packages/torio/_extension/utils.py", line 108, in _find_versionsed_ffmpeg_extension
_load_lib(lib)
File "/home/pd/.local/lib/python3.10/site-packages/torio/_extension/utils.py", line 94, in _load_lib
torch.ops.load_library(path)
File "/home/pd/.local/lib/python3.10/site-packages/torch/_ops.py", line 1295, in load_library
ctypes.CDLL(path)
File "/usr/lib/python3.10/ctypes/__init__.py", line 374, in __init__
self._handle = _dlopen(self._name, mode)
OSError: libavutil.so.57: cannot open shared object file: No such file or directory
Loading FFmpeg4
Failed to load FFmpeg4 extension.
Traceback (most recent call last):
File "/home/pd/.local/lib/python3.10/site-packages/torio/_extension/utils.py", line 116, in _find_ffmpeg_extension
ext = _find_versionsed_ffmpeg_extension(ffmpeg_ver)
File "/home/pd/.local/lib/python3.10/site-packages/torio/_extension/utils.py", line 109, in _find_versionsed_ffmpeg_extension
return importlib.import_module(ext)
File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 674, in _load_unlocked
File "<frozen importlib._bootstrap>", line 571, in module_from_spec
File "<frozen importlib._bootstrap_external>", line 1176, in create_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
ImportError: libavdevice.so.58: cannot open shared object file: No such file or directory
Loading FFmpeg
Failed to load FFmpeg extension.
Traceback (most recent call last):
File "/home/pd/.local/lib/python3.10/site-packages/torio/_extension/utils.py", line 116, in _find_ffmpeg_extension
ext = _find_versionsed_ffmpeg_extension(ffmpeg_ver)
File "/home/pd/.local/lib/python3.10/site-packages/torio/_extension/utils.py", line 106, in _find_versionsed_ffmpeg_extension
raise RuntimeError(f"FFmpeg{version} extension is not available.")
RuntimeError: FFmpeg extension is not available.

此外,在尝试安装 FFmpeg 时,也遇到了如下报错:

pd@pdserver03:~$ sudo apt install ffmpeg
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
ffmpeg : Depends: libavcodec60 (>= 7:6.1)
Depends: libavfilter9 (>= 7:6.0)
Depends: libavformat60 (>= 7:6.0)
libavdevice60 : Depends: libavcodec60 (>= 7:6.0)
Depends: libavfilter9 (>= 7:6.0)
Depends: libavformat60 (= 7:6.1.2-0ubuntu1~22.04.sav0)
E: Unable to correct problems, you have held broken packages.

甚至在使用 Miniconda 激活 Conda 环境时,也遇到了如下问题:

pd@pdserver03:~$ conda activate comfyui_env
CondaError: Run 'conda init' before 'conda activate'

常规解决方案尝试

一开始,我尝试了一些常见的解决方案,比如通过 sudo apt install ffmpeg 安装 FFmpeg,或者使用 Snap 包管理器。然而,这些方法都因为依赖关系问题失败了。甚至在使用 Miniconda 激活 Conda 环境时也遇到了路径设置的问题,这使得一些 Conda 命令无法识别。

手动编译 FFmpeg

在尝试了各种方案后,我回想起之前给另一位 Ubuntu 客户处理 FFmpeg 的问题时,使用了手动编译的方法。因此,我决定通过手动下载并编译 FFmpeg 来解决这个问题。

首先,我克隆了 FFmpeg 的源码:

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg
git checkout a797317ab1

接下来,我确保安装了所有必需的依赖包:

sudo apt install autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo wget yasm zlib1g-dev libunistring-dev
sudo apt install libx264-dev libx265-dev libnuma-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev

在配置 FFmpeg 时,我遇到了 GPL 与 libfdk_aac 的兼容性问题。为了解决这个问题,我添加了 --enable-nonfree 选项:

./configure --prefix="$HOME/ffmpeg_build" --pkg-config-flags="--static" --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --extra-libs="-lpthread -lm" --bindir="$HOME/bin" --enable-gpl --enable-libx264 --enable-libx265 --enable-libvpx --enable-libfdk-aac --enable-libopus --enable-nonfree

然后,我运行了编译和安装命令:

make -j$(nproc)
sudo make install

经过这些步骤,FFmpeg 最终成功安装,客户的问题也顺利解决。

总结

通过这个案例,我再次体会到手动编译软件的灵活性。虽然现在有像 ChatGPT 这样的工具可以帮助解决大部分常见问题,但对于一些小众且复杂的问题,还是需要有一定的技术能力来处理,尤其是在常规安装方式因依赖问题无法奏效时。如果你也遇到了类似的依赖问题,希望本文能够给你一些帮助。如果你有任何想法,欢迎在评论区留言。

举报

相关推荐

0 条评论