Linux 下編譯 VLC

編譯 VLC 簡(jiǎn)單嗎?Wiki 這樣說(shuō):“Compiling VLC is not an easy task.”O(∩_∩)O哈哈~反正各種坑。話雖如此,但也不用太過(guò)擔(dān)心,因?yàn)楣俜教峁┝司幾g教程。雖然有些過(guò)時(shí),但很多地方還是值得參考的!

下面以最新發(fā)布的 VLC 正式版為例,記錄一下 Linux 下編譯的詳細(xì)過(guò)程,以供大家作后續(xù)參考(Good luck),具體環(huán)境如下:
Ubuntu 18.04 LTS
VLC 3.0.8
注意:對(duì)于 VLC 中的各種依賴及其版本要求,可查看 VLC 源碼中的 configure.ac 文件。
1
準(zhǔn)備環(huán)境
VLC 需要 C11 編譯器,開(kāi)發(fā)頭和工具鏈。
建議使用 gcc(版本 >= 4.9),當(dāng)然 clang/LLVM 也是可以的。
如果從 Git 倉(cāng)庫(kù)構(gòu)建,則還需要 GNU 構(gòu)建系統(tǒng),即“autotools”(autoconf、automake、libtool 和 gettext)來(lái)設(shè)置 Makefile。要確保它們是最新的,并且要可用于自己的系統(tǒng)。
$?sudo?apt-get?install?git?build-essential?pkg-config?libtool?automake?autopoint?gettext
2
獲取 VLC 源碼
選擇待編譯的 VLC 版本,這一點(diǎn)至關(guān)重要,那就簡(jiǎn)單說(shuō)說(shuō)吧:
開(kāi)發(fā)版:雖然不太穩(wěn)定,但一般會(huì)提供許多新功能。除非有特殊需求,否則不建議在生產(chǎn)環(huán)境中使用。
穩(wěn)定版(目前為止,最新版是 3.0.8):這是正式發(fā)布的版本,相對(duì)比較穩(wěn)定,可以在生產(chǎn)環(huán)境中使用。
舊版本:不鼓勵(lì)使用,因?yàn)檫@些版本中的 bug 已不再修復(fù)。
選擇 VLC 3.0.8,然后下載源代碼,解壓縮并進(jìn)入最終的目錄:
$?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
獲取第三方庫(kù)
在配置 VLC 之前,要先確保其所需的依賴項(xiàng)都已就緒,否則可能導(dǎo)致 vlc 程序出現(xiàn)錯(cuò)誤。像下面這些就很重要:
ffmpeg(libavcodec、libavformat、libavutil):用于提供編解碼器
Qt:用于提供圖形用戶界面
xcb:用于 X11 下的視頻輸出
taglib:用于獲取多媒體文件信息
Lua:用于 VLC 擴(kuò)展的編程語(yǔ)言
......
要獲取這些依賴項(xiàng),建議使用以下命令,這也是官方推薦的方式:
$?sudo?apt-get?build-dep?vlc
倘若沒(méi)有指定代碼源,則會(huì)提示以下信息:
>?正在讀取軟件包列表...?完成
>?E:?您必須在?sources.list?中指定代碼源(deb-src)?URI
這時(shí)需要打開(kāi)“軟件和更新”界面,選中下圖中的“源代碼”以及最佳的服務(wù)器(國(guó)內(nèi)建議選擇“中國(guó)的服務(wù)器”):

完成之后,記得要“重新載入”以更新緩存。
然后再次執(zhí)行上述命令,由于下載的軟件包過(guò)多,可能有些無(wú)法正常下載:
......
E: 無(wú)法下載 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: 無(wú)法下載 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: 無(wú)法下載 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: 有幾個(gè)軟件包無(wú)法下載,要不運(yùn)行 apt-get update 或者加上 --fix-missing 的選項(xiàng)再試試?
E: 無(wú)法處理構(gòu)建依賴關(guān)系
按照提示運(yùn)行 sudo apt-get update,然后再次執(zhí)行上述命令,這時(shí)就能夠正常處理了:
$?sudo?apt-get?build-dep?vlc
正在讀取軟件包列表...?完成
正在讀取軟件包列表...?完成
正在分析軟件包的依賴關(guān)系樹(shù)???????
正在讀取狀態(tài)信息...?完成???????
下列【新】軟件包將被安裝:
??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
下列軟件包將被升級(jí):
??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
升級(jí)了 23 個(gè)軟件包,新安裝了 329 個(gè)軟件包,要卸載?0?個(gè)軟件包,有 225 個(gè)軟件包未被升級(jí)。
需要下載 2,711 kB/92.3 MB 的歸檔。
解壓縮后會(huì)消耗 363 MB 的額外空間。
您希望繼續(xù)執(zhí)行嗎??[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,耗時(shí)?34秒?(26.7?kB/s)???????????????????????????????????????????????????????????????????????????????????????????????
正在從軟件包中解出模板:100%
正在預(yù)設(shè)定軟件包?...
(正在讀取數(shù)據(jù)庫(kù) ... 系統(tǒng)當(dāng)前共安裝有 134279 個(gè)文件和目錄。)
正準(zhǔn)備解包?.../libsystemd0_237-3ubuntu10.33_amd64.deb??...
正在將?libsystemd0:amd64?(237-3ubuntu10.33)?解包到?(237-3ubuntu10.24)?上?...
正在設(shè)置?libsystemd0:amd64?(237-3ubuntu10.33)?...
(正在讀取數(shù)據(jù)庫(kù) ... 系統(tǒng)當(dāng)前共安裝有 134279 個(gè)文件和目錄。)
正準(zhǔn)備解包?.../libpam-systemd_237-3ubuntu10.33_amd64.deb??...
正在將?libpam-systemd:amd64?(237-3ubuntu10.33)?解包到?(237-3ubuntu10.24)?上?...
正準(zhǔn)備解包?.../libnss-systemd_237-3ubuntu10.33_amd64.deb??...
正在將?libnss-systemd:amd64?(237-3ubuntu10.33)?解包到?(237-3ubuntu10.24)?上?...
正準(zhǔn)備解包?.../systemd_237-3ubuntu10.33_amd64.deb??...
正在將?systemd?(237-3ubuntu10.33)?解包到?(237-3ubuntu10.24)?上?...
正準(zhǔn)備解包?.../udev_237-3ubuntu10.33_amd64.deb??...
正在將?udev?(237-3ubuntu10.33)?解包到?(237-3ubuntu10.24)?上?...
......
......
......
正在設(shè)置?dh-strip-nondeterminism?(0.040-1.1~build1)?...
正在設(shè)置?libpango1.0-dev?(1.40.14-1ubuntu0.1)?...
正在設(shè)置?libgtk-3-dev:amd64?(3.22.30-1ubuntu4)?...
正在處理用于?libc-bin?(2.27-3ubuntu1)?的觸發(fā)器?...
正在處理用于?initramfs-tools?(0.130ubuntu3.8)?的觸發(fā)器?...
update-initramfs:?Generating?/boot/initrd.img-5.0.0-23-generic
這個(gè)過(guò)程耗時(shí)比較長(zhǎng),耐心等待吧!
4
編譯 VLC
配置步驟用于檢測(cè)系統(tǒng)是否能夠編譯 VLC。對(duì)大多數(shù)用戶來(lái)說(shuō),./configure 不需要任何命令行選項(xiàng)。默認(rèn)情況下,它會(huì)根據(jù)檢測(cè)到的庫(kù)是否可用來(lái)自動(dòng)選擇要編譯的特性。
例如,如果無(wú)法在系統(tǒng)上檢測(cè)到 taglib,那么 configure 腳本將會(huì)禁用該模塊(因?yàn)樗鼰o(wú)法編譯)。除此之外,還可以通過(guò)傳遞正確的參數(shù)來(lái)啟用/禁用某些特性:
--enable-*(或者 --disable-*):有很多這樣的參數(shù),通過(guò) ./configure --help 即可查看。其中,enable 表示啟用,disable 則表示禁用。
--enable-debug:啟用調(diào)試符號(hào)。如果想調(diào)試 VLC,該參數(shù)將非常有用;但如果是生產(chǎn)環(huán)境,盡量不要使用。
$?./configure
注意:如果庫(kù)不在默認(rèn)目錄,也不在 vlc 源碼所在目錄,為了使 ./configure 找到這些庫(kù),需要用 PKG_CONFIG_PATH 去指定它們的路徑。
當(dāng)配置完成之后,就可以編譯安裝 VLC 了:
$?sudo?make?-j4
$?sudo?make?install
為了提高編譯速度,這里使用了 -j4,以啟用多核編譯。
5
檢查 VLC
當(dāng)安裝完成之后,記得檢查 VLC 能否正常使用,先來(lái)看一下版本信息:
$?vlc?--version
vlc:?error?while?loading?shared?libraries:?libvlc.so.5:?cannot?open?shared?object?file:?No?such?file?or?directory
加載動(dòng)態(tài)庫(kù)失敗,沒(méi)關(guān)系,重新配置一下即可:
$?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?編譯時(shí)間?waleon-virtual-machine?(Dec?18?2019?14:54:42)
編譯器:?gcc?version?7.4.0?(Ubuntu?7.4.0-1ubuntu1~18.04.1)
本程序在法律許可范圍內(nèi)?*無(wú)任何擔(dān)保*。
您可以依照 GNU GPL 許可證的條款再次分發(fā)本程序;
詳情請(qǐng)參閱名為 COPYING 的文件。
由 VideoLAN 團(tuán)隊(duì)編寫;參見(jiàn) AUTHORS 文件。
如果想啟動(dòng)播放器,可以使用 vlc 命令:
$?vlc
打開(kāi)網(wǎng)絡(luò)串流,并輸入一個(gè)網(wǎng)絡(luò) URL:

O(∩_∩)O哈哈~,可以正常使用了,看起來(lái)還不錯(cuò)吧!
6
常見(jiàn)問(wèn)題
如果你自己手動(dòng)下載依賴項(xiàng),那么在編譯 VLC 時(shí)難免會(huì)出現(xiàn)各種問(wèn)題,以下是最常見(jiàn)的一些問(wèn)題以及對(duì)應(yīng)的解決方案(都是坑啊,第一次我也遇到了不少)。
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?
以為就這些錯(cuò)誤?不不不,可能還有更多的坑在等著你。所以呢,還是建議用官方推薦的方式獲取依賴,不要自己給自己找麻煩哦!
7
更多參考
有關(guān) VLC 的源碼、編譯/配置等相關(guān)內(nèi)容,也可以參考以下資料,里面都有很詳細(xì)的說(shuō)明:
VLC 下載(正式版):http://download.videolan.org/pub/videolan/vlc/
VLC 下載(Nightly 版):https://nightlies.videolan.org/build/
VLC 編譯(針對(duì)各平臺(tái)):https://wiki.videolan.org/Category:Building/
VLC 編譯(針對(duì) 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·
?
點(diǎn)個(gè)在看,么么噠!

