Linux 下编译 VLC
编译 VLC 简单吗?Wiki 这样说:“Compiling VLC is not an easy task.”O(∩_∩)O哈哈~反正各种坑。话虽如此,但也不用太过担心,因为官方提供了编译教程。虽然有些过时,但很多地方还是值得参考的!
下面以最新发布的 VLC 正式版为例,记录一下 Linux 下编译的详细过程,以供大家作后续参考(Good luck),具体环境如下:
Ubuntu 18.04 LTS
VLC 3.0.8
注意:对于 VLC 中的各种依赖及其版本要求,可查看 VLC 源码中的 configure.ac 文件。
1
准备环境
VLC 需要 C11 编译器,开发头和工具链。
建议使用 gcc(版本 >= 4.9),当然 clang/LLVM 也是可以的。
如果从 Git 仓库构建,则还需要 GNU 构建系统,即“autotools”(autoconf、automake、libtool 和 gettext)来设置 Makefile。要确保它们是最新的,并且要可用于自己的系统。
$ sudo apt-get install git build-essential pkg-config libtool automake autopoint gettext
2
获取 VLC 源码
选择待编译的 VLC 版本,这一点至关重要,那就简单说说吧:
开发版:虽然不太稳定,但一般会提供许多新功能。除非有特殊需求,否则不建议在生产环境中使用。
稳定版(目前为止,最新版是 3.0.8):这是正式发布的版本,相对比较稳定,可以在生产环境中使用。
旧版本:不鼓励使用,因为这些版本中的 bug 已不再修复。
选择 VLC 3.0.8,然后下载源代码,解压缩并进入最终的目录:
$ wget http://download.videolan.org/pub/videolan/vlc/3.0.8/vlc-3.0.8.tar.xz
$ tar xvJf vlc-3.0.8.tar.xz
$ cd vlc-3.0.8
3
获取第三方库
在配置 VLC 之前,要先确保其所需的依赖项都已就绪,否则可能导致 vlc 程序出现错误。像下面这些就很重要:
ffmpeg(libavcodec、libavformat、libavutil):用于提供编解码器
Qt:用于提供图形用户界面
xcb:用于 X11 下的视频输出
taglib:用于获取多媒体文件信息
Lua:用于 VLC 扩展的编程语言
......
要获取这些依赖项,建议使用以下命令,这也是官方推荐的方式:
$ sudo apt-get build-dep vlc
倘若没有指定代码源,则会提示以下信息:
> 正在读取软件包列表... 完成
> E: 您必须在 sources.list 中指定代码源(deb-src) URI
这时需要打开“软件和更新”界面,选中下图中的“源代码”以及最佳的服务器(国内建议选择“中国的服务器”):
完成之后,记得要“重新载入”以更新缓存。
然后再次执行上述命令,由于下载的软件包过多,可能有些无法正常下载:
......
E: 无法下载 http://cn.archive.ubuntu.com/ubuntu/pool/main/l/lua5.2/liblua5.2-dev_5.2.4-1.1build1_amd64.deb 连接失败 [IP: 91.189.91.24 80]
E: 无法下载 http://cn.archive.ubuntu.com/ubuntu/pool/universe/libm/libmatroska/libmatroska-dev_1.4.8-1.1_amd64.deb 连接失败 [IP: 91.189.91.26 80]
E: 无法下载 http://cn.archive.ubuntu.com/ubuntu/pool/universe/libd/libdc1394-22/libdc1394-22-dev_2.2.5-1_amd64.deb 连接失败 [IP: 91.189.91.14 80]
E: 有几个软件包无法下载,要不运行 apt-get update 或者加上 --fix-missing 的选项再试试?
E: 无法处理构建依赖关系
按照提示运行 sudo apt-get update,然后再次执行上述命令,这时就能够正常处理了:
$ sudo apt-get build-dep vlc
正在读取软件包列表... 完成
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列【新】软件包将被安装:
bison debhelper dh-autoreconf dh-strip-nondeterminism flex gir1.2-harfbuzz-0.0 icu-devtools liba52-0.7.4 liba52-0.7.4-dev
libaa1-dev libarchive-dev libaribb24-0 libaribb24-dev libasound2-dev libass-dev libass9 libatk-bridge2.0-dev libatk1.0-dev
libatspi2.0-dev libavahi-client-dev libavahi-common-dev libavc1394-dev libavcodec-dev libavcodec57 libavformat-dev libavformat57
libavresample-dev libavresample3 libavutil-dev libavutil55 libbasicusageenvironment1 libbison-dev libbluray-dev libbluray2
libcaca-dev libcairo-script-interpreter2 libcairo2-dev libcddb2 libcddb2-dev libcdio-dev libchromaprint-dev libchromaprint1
libcrystalhd-dev libcrystalhd3 libdbus-1-dev libdc1394-22 libdc1394-22-dev libdca-dev libdca0 libdouble-conversion1 libdrm-dev
libdvbpsi-dev libdvbpsi10 libdvdnav-dev libdvdnav4 libdvdread-dev libdvdread4 libebml-dev libebml4v5 libegl1-mesa-dev
libepoxy-dev libevdev-dev libexpat1-dev libfaad-dev libfaad2 libfile-stripnondeterminism-perl libflac-dev libfluidsynth-dev
libfluidsynth1 libfontconfig1-dev libfreetype6-dev libfribidi-dev libgcrypt20-dev libgdk-pixbuf2.0-dev libgl1-mesa-dev libgles1
libgles2-mesa-dev libglib2.0-dev libglib2.0-dev-bin libglu1-mesa-dev libglvnd-core-dev libglvnd-dev libgme0 libgmp-dev
libgmpxx4ldbl libgnutls-dane0 libgnutls-openssl27 libgnutls28-dev libgnutlsxx28 libgpg-error-dev libgraphite2-dev libgroupsock8
libgsm1 libgtk-3-dev libharfbuzz-dev libharfbuzz-gobject0 libice-dev libicu-dev libicu-le-hb-dev libicu-le-hb0 libiculx60
libidn11-dev libidn2-0-dev libidn2-dev libinput-dev libiso9660-10 libiso9660-dev libjack-jackd2-dev libjbig-dev libjpeg-dev
libjpeg-turbo8-dev libjpeg8-dev libkate-dev libkate1 liblirc-dev liblirc0 liblivemedia-dev liblivemedia62 liblua5.2-0
liblua5.2-dev liblzma-dev libmad0 libmad0-dev libmatroska-dev libmatroska6v5 libmicrodns-dev libmicrodns0 libmpcdec-dev
libmpcdec6 libmpeg2-4 libmpeg2-4-dev libmpg123-dev libmtdev-dev libmtp-dev libncurses5-dev libncursesw5-dev libnfs-dev libnfs11
libnotify-dev libogg-dev libomxil-bellagio-dev libomxil-bellagio0 libopengl0 libopenjp2-7 libopenmpt-dev libopenmpt-modplug-dev
libopenmpt-modplug1 libopenmpt0 libopus-dev libout123-0 libp11-kit-dev libpango1.0-dev libpcre16-3 libpcre3-dev libpcre32-3
libpcrecpp0v5 libpixman-1-dev libplacebo-dev libplacebo4 libpng-dev libpostproc-dev libpostproc54 libprotobuf-dev
libprotobuf-lite10 libprotoc10 libpthread-stubs0-dev libpulse-dev libqt5concurrent5 libqt5core5a libqt5dbus5 libqt5gui5
libqt5network5 libqt5printsupport5 libqt5sql5 libqt5svg5 libqt5svg5-dev libqt5test5 libqt5widgets5 libqt5x11extras5
libqt5x11extras5-dev libqt5xml5 libraw1394-dev libreadline-dev libresid-builder-dev libresid-builder0c2a librsvg2-dev
libsamplerate0-dev libsdl-image1.2 libsdl-image1.2-dev libsdl1.2-dev libsdl1.2debian libsecret-1-dev libset-scalar-perl
libshine-dev libshine3 libshout3-dev libsidplay2 libsidplay2-dev libslang2-dev libsm-dev libsmbclient-dev libsnappy1v5
libsndio-dev libsndio6.1 libsoxr-dev libsoxr-lsr0 libsoxr0 libspeex-dev libspeexdsp-dev libssh-gcrypt-4 libssh2-1 libssh2-1-dev
libssl-dev libswresample-dev libswresample2 libswscale-dev libswscale4 libsystemd-dev libtag1-dev libtasn1-6-dev libtheora-dev
libtiff-dev libtiff5-dev libtiffxx5 libtinfo-dev libtwolame-dev libudev-dev libunbound2 libupnp-dev libupnp6 libupnp6-dev
libusageenvironment3 libusb-0.1-4 libusb-1.0-0-dev libv4l-dev libv4l2rds0 libva-dev libva-drm2 libva-glx2 libva-wayland2
libva-x11-2 libva2 libvcdinfo-dev libvcdinfo0 libvdpau-dev libvdpau1 libvncserver-config libvncserver-dev libvncserver1
libvorbis-dev libvulkan1 libwacom-dev libwayland-bin libwayland-dev libwebp-dev libx11-dev libx11-xcb-dev libx264-152
libx264-dev libx265-146 libx265-dev libxau-dev libxcb-composite0 libxcb-composite0-dev libxcb-dri2-0-dev libxcb-dri3-dev
libxcb-glx0-dev libxcb-keysyms1-dev libxcb-present-dev libxcb-randr0-dev libxcb-render0-dev libxcb-shape0-dev libxcb-shm0-dev
libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0 libxcb-xv0-dev libxcb1-dev libxcomposite-dev libxcursor-dev libxdamage-dev
libxdmcp-dev libxext-dev libxfixes-dev libxft-dev libxi-dev libxinerama-dev libxkbcommon-dev libxml2-dev libxpm-dev
libxrandr-dev libxrender-dev libxshmfence-dev libxtst-dev libxvidcore4 libxxf86vm-dev libzvbi-common libzvbi-dev libzvbi0 lua5.2
mesa-common-dev nettle-dev po-debconf protobuf-compiler python3-distutils python3-lib2to3 qt5-qmake qt5-qmake-bin qtbase5-dev
qtbase5-dev-tools qtbase5-private-dev qtchooser wayland-protocols x11proto-composite-dev x11proto-core-dev x11proto-damage-dev
x11proto-dev x11proto-fixes-dev x11proto-input-dev x11proto-randr-dev x11proto-record-dev x11proto-xext-dev
x11proto-xf86vidmode-dev x11proto-xinerama-dev xorg-sgml-doctools xtrans-dev zlib1g-dev zsh zsh-common
下列软件包将被升级:
libarchive13 libexpat1 libidn2-0 libjpeg-turbo8 libnss-systemd libpam-systemd libpulse-mainloop-glib0 libpulse0 libpulsedsp
libsmbclient libssl1.1 libsystemd0 libtiff5 libudev1 libwbclient0 libxkbcommon-x11-0 libxkbcommon0 pulseaudio
pulseaudio-module-bluetooth pulseaudio-utils samba-libs systemd udev
升级了 23 个软件包,新安装了 329 个软件包,要卸载 0 个软件包,有 225 个软件包未被升级。
需要下载 2,711 kB/92.3 MB 的归档。
解压缩后会消耗 363 MB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://cn.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libqt5network5 amd64 5.9.5+dfsg-0ubuntu2.4 [634 kB]
获取:2 http://cn.archive.ubuntu.com/ubuntu bionic/universe amd64 libx265-146 amd64 2.6-3 [1,026 kB]
获取:3 http://cn.archive.ubuntu.com/ubuntu bionic/universe amd64 libfluidsynth1 amd64 1.1.9-1 [137 kB]
获取:4 http://cn.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libidn11-dev amd64 1.33-2.1ubuntu1.2 [520 kB]
获取:5 http://cn.archive.ubuntu.com/ubuntu bionic/universe amd64 libusageenvironment3 amd64 2018.02.18-1 [6,944 B]
获取:6 http://cn.archive.ubuntu.com/ubuntu bionic/main amd64 liblua5.2-dev amd64 5.2.4-1.1build1 [134 kB]
获取:7 http://cn.archive.ubuntu.com/ubuntu bionic/universe amd64 libmatroska-dev amd64 1.4.8-1.1 [144 kB]
获取:8 http://cn.archive.ubuntu.com/ubuntu bionic/universe amd64 libdc1394-22-dev amd64 2.2.5-1 [109 kB]
已下载 896 kB,耗时 34秒 (26.7 kB/s)
正在从软件包中解出模板:100%
正在预设定软件包 ...
(正在读取数据库 ... 系统当前共安装有 134279 个文件和目录。)
正准备解包 .../libsystemd0_237-3ubuntu10.33_amd64.deb ...
正在将 libsystemd0:amd64 (237-3ubuntu10.33) 解包到 (237-3ubuntu10.24) 上 ...
正在设置 libsystemd0:amd64 (237-3ubuntu10.33) ...
(正在读取数据库 ... 系统当前共安装有 134279 个文件和目录。)
正准备解包 .../libpam-systemd_237-3ubuntu10.33_amd64.deb ...
正在将 libpam-systemd:amd64 (237-3ubuntu10.33) 解包到 (237-3ubuntu10.24) 上 ...
正准备解包 .../libnss-systemd_237-3ubuntu10.33_amd64.deb ...
正在将 libnss-systemd:amd64 (237-3ubuntu10.33) 解包到 (237-3ubuntu10.24) 上 ...
正准备解包 .../systemd_237-3ubuntu10.33_amd64.deb ...
正在将 systemd (237-3ubuntu10.33) 解包到 (237-3ubuntu10.24) 上 ...
正准备解包 .../udev_237-3ubuntu10.33_amd64.deb ...
正在将 udev (237-3ubuntu10.33) 解包到 (237-3ubuntu10.24) 上 ...
......
......
......
正在设置 dh-strip-nondeterminism (0.040-1.1~build1) ...
正在设置 libpango1.0-dev (1.40.14-1ubuntu0.1) ...
正在设置 libgtk-3-dev:amd64 (3.22.30-1ubuntu4) ...
正在处理用于 libc-bin (2.27-3ubuntu1) 的触发器 ...
正在处理用于 initramfs-tools (0.130ubuntu3.8) 的触发器 ...
update-initramfs: Generating /boot/initrd.img-5.0.0-23-generic
这个过程耗时比较长,耐心等待吧!
4
编译 VLC
配置步骤用于检测系统是否能够编译 VLC。对大多数用户来说,./configure 不需要任何命令行选项。默认情况下,它会根据检测到的库是否可用来自动选择要编译的特性。
例如,如果无法在系统上检测到 taglib,那么 configure 脚本将会禁用该模块(因为它无法编译)。除此之外,还可以通过传递正确的参数来启用/禁用某些特性:
--enable-*(或者 --disable-*):有很多这样的参数,通过 ./configure --help 即可查看。其中,enable 表示启用,disable 则表示禁用。
--enable-debug:启用调试符号。如果想调试 VLC,该参数将非常有用;但如果是生产环境,尽量不要使用。
$ ./configure
注意:如果库不在默认目录,也不在 vlc 源码所在目录,为了使 ./configure 找到这些库,需要用 PKG_CONFIG_PATH 去指定它们的路径。
当配置完成之后,就可以编译安装 VLC 了:
$ sudo make -j4
$ sudo make install
为了提高编译速度,这里使用了 -j4,以启用多核编译。
5
检查 VLC
当安装完成之后,记得检查 VLC 能否正常使用,先来看一下版本信息:
$ vlc --version
vlc: error while loading shared libraries: libvlc.so.5: cannot open shared object file: No such file or directory
加载动态库失败,没关系,重新配置一下即可:
$ sudo /sbin/ldconfig
再次尝试一下,版本信息就可以正常显示了:
$ vlc --version
VLC media player 3.0.8 Vetinari (revision 3.0.8-0-gf350b6b5a7)
VLC 版本 3.0.8 Vetinari (3.0.8-0-gf350b6b5a7)
编译者 waleon 编译时间 waleon-virtual-machine (Dec 18 2019 14:54:42)
编译器: gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
本程序在法律许可范围内 *无任何担保*。
您可以依照 GNU GPL 许可证的条款再次分发本程序;
详情请参阅名为 COPYING 的文件。
由 VideoLAN 团队编写;参见 AUTHORS 文件。
如果想启动播放器,可以使用 vlc 命令:
$ vlc
打开网络串流,并输入一个网络 URL:
O(∩_∩)O哈哈~,可以正常使用了,看起来还不错吧!
6
常见问题
如果你自己手动下载依赖项,那么在编译 VLC 时难免会出现各种问题,以下是最常见的一些问题以及对应的解决方案(都是坑啊,第一次我也遇到了不少)。
configure: error: Could not find lua. Lua is needed for some interfaces (rc, telnet, http) as well as many other custom scripts. Use --disable-lua to ignore this error.
解决方案:
$ sudo apt-get install lua5.2 liblua5.2-dev
configure: error: Could not find liba52 on your system: you may get it from http://liba52.sf.net/. Alternatively you can use --disable-a52 to disable the a52 plugin.
解决方案:
$ sudo apt-get install liba52-dev
configure: error: Package requirements (xcb >= 1.6) were not met:
No package 'xcb' found
解决方案:
$ sudo apt-get install libxcb-shm0-dev libxcb-xv0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-composite0-dev
configure: error: No package 'alsa' found. alsa-lib 1.0.24 or later required. Pass --disable-alsa to ignore this error.
解决方案:
$ sudo apt-get install libalsa-ocaml-dev
以为就这些错误?不不不,可能还有更多的坑在等着你。所以呢,还是建议用官方推荐的方式获取依赖,不要自己给自己找麻烦哦!
7
更多参考
有关 VLC 的源码、编译/配置等相关内容,也可以参考以下资料,里面都有很详细的说明:
VLC 下载(正式版):http://download.videolan.org/pub/videolan/vlc/
VLC 下载(Nightly 版):https://nightlies.videolan.org/build/
VLC 编译(针对各平台):https://wiki.videolan.org/Category:Building/
VLC 编译(针对 Unix):https://wiki.videolan.org/UnixCompile/
VLC 配置:https://wiki.videolan.org/Configure/
VLC 依赖(完整版):https://wiki.videolan.org/Contrib_Status/
VLC-3.0.8 依赖:http://www.linuxfromscratch.org/blfs/view/svn/multimedia/vlc.html
·END·