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

报错信息复现与分析
复现用户的问题后,以下是客户遇到的完整报错信息:
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 这样的工具可以帮助解决大部分常见问题,但对于一些小众且复杂的问题,还是需要有一定的技术能力来处理,尤其是在常规安装方式因依赖问题无法奏效时。如果你也遇到了类似的依赖问题,希望本文能够给你一些帮助。如果你有任何想法,欢迎在评论区留言。