我正在尝试使用 FFmpeg 执行来自 Video Stackexchange 的此线程的超分辨率:FFmpeg 中的超分辨率过滤器如何工作?.
系统 :
- Ubuntu 20.04
- Nvidia 510(使用验证
nvidia-smi
) - CUDA 11.6(使用 (
nvcc --version
)验证 - CUDNN 8.4(安装方法和运行验证跟随他们的官网)
- Tensorflow 2.7.0(安装方法及运行验证跟随其官网)
- TensorRT(从 安装
pip3
) - 安装
zlib1g
和zlib1g-dev
(通过apt-get
)
我必须使用 tensorflow 构建 ffmpeg,这是教程中的完整设置:
./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-gnutls \
--enable-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-libtensorflow \
--enable-nonfree
错误:
从源代码构建和安装 FFmpeg 期间没有错误。但是,运行 FFmpeg(包括ffmpeg --version
)会导致此错误:
ffmpeg: Relink `/usr/local/lib/libtensorflow_framework.so.2' with `/lib/x86_64-linux-gnu/libz.so.1' for IFUNC symbol `crc32_z'
ffmpeg: symbol lookup error: ffmpeg: undefined symbol: vaSyncBuffer
看起来它与 tensorflow 相关,但是我已经验证 tensorflow 在我的系统上正常工作。我在谷歌上找不到任何东西,只有一个线程在讨论完全相同的错误(这里),但是仍然没有解决方案。我知道该错误与符号链接无关,但以防万一需要此信息:
$ ls -l /usr/local/lib | grep "libtensor*"
lrwxrwxrwx 1 root root 28 Apr 10 05:17 libtensorflow_framework.so -> libtensorflow_framework.so.2
lrwxrwxrwx 1 root root 32 Apr 10 05:19 libtensorflow_framework.so.2 -> libtensorflow_framework.so.2.7.0
-r-xr-xr-x 1 root root 38362936 Apr 10 05:14 libtensorflow_framework.so.2.7.0
lrwxrwxrwx 1 root root 18 Apr 10 05:18 libtensorflow.so -> libtensorflow.so.2
lrwxrwxrwx 1 root root 22 Apr 10 05:19 libtensorflow.so.2 -> libtensorflow.so.2.7.0
-r-xr-xr-x 1 root root 784355912 Apr 10 05:14 libtensorflow.so.2.7.0
$ ldd /usr/local/lib/libtensorflow_framework.so.2
linux-vdso.so.1 (0x00007ffdd598e000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc9f93bd000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc9f926e000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fc9f9264000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc9f9241000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fc9f9027000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fc9f900c000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc9f8e18000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc9fb31a000)
$ ls -l /lib/x86_64-linux-gnu | grep "libz.*"
lrwxrwxrwx 1 root root 14 Oct 15 2020 libz.so.1 -> libz.so.1.2.11
-rw-r--r-- 1 root root 108936 Oct 15 2020 libz.so.1.2.11
$ ldd /lib/x86_64-linux-gnu/libz.so.1
linux-vdso.so.1 (0x00007ffc693bf000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3935cfb000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3935f5c000)
[更新]
错误 1 已解决(请参阅下面的答案)。现在剩下的是错误2:
$ ffmpeg --version
ffmpeg: symbol lookup error: ffmpeg: undefined symbol: vaSyncBuffer
有什么建议吗?
修复错误 1:
我已经
zlib1g
通过安装了apt-get
,我想这就是问题所在,因为它不是 FFmpeg 想要的版本。我正在通过一些修改来回答这个问题:查找有关符号链接的信息
libz.so.1
打开这个网站并在符号链接后面寻找一个包(我的是
libz.so.1.2.11
)。我下载了所有软件包(其中 3 个:zlib1g
和zlib1g-dev
)zlib1g-dbg
。删除并清除已安装的
zlib1g
和zlib1g-dev
,然后在必要时apt-get remove --purge
修复任何内容。sudo apt --fix-broken install
从第 2 点安装 3 个软件包:
sudo dpkg -i
sudo ldconfig.
完成,错误1消失了。
PS:如果您这样做
apt-get dist-upgrade
,您将被要求升级zlib1g
和/或zlib1g-dev
,好吧,不要升级它们,否则您将再次遇到此错误。我持有我的升级版apt-mark hold
。修复错误 2:
从机器上删除所有
libva*
安装。从 Intel Github安装libva和libva-utils 。
libva
特别是将安装在 FFmpeg 找不到的目录中。因此,在两者的配置过程中,添加前缀/usr
重启。
不再有 vaSyncBuffer 错误。FFmpeg 设法找到
libva