环境:
· Ubuntu16.04
· gcc (Ubuntu5.4.0-6ubuntu1~16.04.9) 5.4.0
· ffmpeg version 3.4.2Copyright (c) 2000-2018 the FFmpeg developers
builtwith gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 20160609
configuration:--enable-gpl --enable-version3 --enable-nonfree --enable-pic --enable-shared--enable-static --enable-libx264 --enable-libx265
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
· protobuf-2.4.1
· qt-5.7.0(.run 安装方式)
这次编译过程主要是跟着官方教程,但是因为官方教程比较老旧,会遇到很多问题,所以把这次的编译过程记录下来。
1. 准备环境
VLC需要C11编译器,开发头文件和工具链。
建议使用gcc(版本4.9或更高版本),但是也可以使用clang / LLVM。
如果您从Git仓库构建,您还需要GNU构建系统,即“autotools”(autoconf,automake,libtool和gettext)来设置Makefiles。确保它们是最新的并可用于您的系统。
%sudo apt-get install git build-essential pkg-config libtool automakeautopoint gettext
2. 获取源代码
首先获取源代码,使用Git来跟踪VLC开发。
%git clone git://git.videolan.org/vlc.git
%cd vlc
%./bootstrap
3. 获取第三方库
现在你几乎可以配置 VLC构建。但首先,您需要确保所有必需的依赖关系都已到位。您必须安装并启用您需要的所有第三方库。如果您未能安装所需的库,则最终可能会导致VLC应用程序出现故障。
$sudo apt-get build-dep vlc
4. 配置
./configure用于检查你的系统是否能够编译VLC。您也可以选择构建中的功能。提醒一下,该命令将显示各种选项:
%./configure --help
对于大多数用户来说,./configure不需要任何命令行选项。
默认情况下,要编译的功能是根据检测到的可用库自动选择的。如果首先编译了贡献,则所产生的VLC将具有合理的功能。
请注意,为了使./configure找到它们,必须为pkg-config知道不在默认前缀中且不在vlc contrib中的库。为此使用PKG_CONFIG_PATH。
有一些功能在默认情况下被禁用(未编译)。如果你想要他们,他们必须通过使用配置标志强制。您可以通过在./configure --help中搜索“disabled”来找到这些功能的列表。、
5. 编译
编译VLC:
%make
你不需要安装VLC来使用它。你也可以简单地从build目录运行它:
#./vlc
如果你真的想将VLC安装到系统中,以root身份运行:
#make install
以上是大致的编译过程,但是在第一遍编译过程中还是有很多问题,比如:
ERROR#1:
未安装库的错误:
未安装LUA:LUA byte compiler missing
sudoapt-get install lua5.1
未安装XCB:VLC 1.1和更高版本需要XCB库来处理X11显示。不要禁用XCB,否则您将无法获得任何视频支持!
%sudo apt-get install libxcb-shm0-dev libxcb-xv0-devlibxcb-keysyms1-dev libxcb-randr0-dev libxcb-composite0-dev
编译ffmpeg:
编译 protobuf
ERROR#2:
Make时发生错误:
/usr/local/lib/libavutil.a(hwcontext_vaapi.o):In function `vaapi_device_free':
/home/hcr/ffmpeg-3.4.2/libavutil/hwcontext_vaapi.c:1123:undefined reference to `XCloseDisplay'
/usr/local/lib/libavutil.a(hwcontext_vaapi.o):In function `vaapi_device_create':
/home/hcr/ffmpeg-3.4.2/libavutil/hwcontext_vaapi.c:1192:undefined reference to `XOpenDisplay'
/home/hcr/ffmpeg-3.4.2/libavutil/hwcontext_vaapi.c:1197:undefined reference to `vaGetDisplay'
/home/hcr/ffmpeg-3.4.2/libavutil/hwcontext_vaapi.c:1204:undefined reference to `XDisplayName'
/home/hcr/ffmpeg-3.4.2/libavutil/hwcontext_vaapi.c:1194:undefined reference to `XDisplayName'
/home/hcr/ffmpeg-3.4.2/libavutil/hwcontext_vaapi.c:1221:undefined reference to `vaGetDisplayDRM'
/home/hcr/ffmpeg-3.4.2/libavutil/hwcontext_vaapi.c:1192:undefined reference to `XOpenDisplay'
/home/hcr/ffmpeg-3.4.2/libavutil/hwcontext_vaapi.c:1194:undefined reference to `XDisplayName'
/home/hcr/ffmpeg-3.4.2/libavutil/hwcontext_vaapi.c:1199:undefined reference to `XDisplayName'
程序中使用了Xlib,链接时出现此错误,是编译选项-lX11的位置的问题,这个选项只能出现在最后,把Makefile中的错误都改过来。注意的是每次./configure过后都需要纠正这个错误。同时make命令加上LDFLAGS=-lX11
错误命令:g++ -lX11 -o test test.o
正确命令:g++ test.o –lX11
ERROR#3
/usr/bin/ld:/usr/local/src/vlc/x264-snapshot-20100524-2245/libx264.a(cabac-a.o): relocationR_X86_64_PC32 against `x264_cabac_range_lps' can not be used when making ashared object; recompile with -fPIC
/usr/bin/ld:final link failed: Bad value
collect2:ld returned 1 exit status
在对应的CFLAGS里面加上“-fPIC”选项:CFLAGS="-fPIC"./configure
解决了这几个问题基本上就编译通过了,但是没有图形界面,尽可以通过add命令播放视频,这时候才想到自己都没有装Qt,而且./configure的时候也没有提出对Qt的依赖。我才意识到是./configure的选项的问题,不能完全不使用编译选项。官方推荐了一个选项。
这是一个典型的VLC配置线的例子:
%./configure --enable-x11 --enable-xvideo --enable-sdl--enable-avcodec --enable-avformat --enable-swscale --enable-mad--enable-libdvbpsi --enable-a52 --enable-libmpeg2 --enable-dvdnav --enable-faad--enable-vorbis --enable-ogg --enable-theora --enable-faac --enable-mkv--enable-freetype --enable-fribidi --enable-speex --enable-flac--enable-live555 --with-live555-tree = / usr / lib / live --enable-caca--enable-skins --enable-skins2 --enable-alsa --enable-qt4 --enable-ncurses
按照新的configure选项开始了第二遍编译,出现了以下的错误:
ERROR#4:
Notfound Qt5Svg
重新安装了Qt5.7.0,并且把编译选项--enable-qt4改为--enable-qt5
ERROR#5:
gui/qt/components/interface_widgets.cpp:61:22:fatal error: 5.5.1/QtGui/qpa/qplatformnativeinterface.h: No such file ordirectory compilationterminated.
有可能是wayland和Qt发生冲突,选用了—disable-wayland选项
ERROR#6:
checkingfor Qt ... no
在configure和make的时候都加上了选项,好像make时候的选项是不必要的
./configure--with-qt-dir=/opt/Qt5.7.0/5.7/gcc_64 --with-qt-includes=/opt/Qt5.7.0/5.7/gcc_64/include--with-qt-libraries=/opt/Qt5.7.0/5.7/gcc_64/lib
CFLAGS="-fPIC"./configure --enable-x11 --enable-xvideo --enable-sdl --enable-avcodec--enable-avformat --enable-swscale--enable-mad --enable-libdvbpsi --enable-a52 --enable-libmpeg2 --enable-dvdnav --enable-faad --enable-vorbis --enable-ogg--enable-theora --enable-faac --enable-mkv --enable-freetype --enable-fribidi --enable-speex --enable-flac--enable-live555 --with-live555-tree=/usr/lib/live --enable-caca --enable-skins --enable-skins2--enable-alsa --enable-qt5 --enable-ncurses --disable-wayland--with-qt-dir=/opt/Qt5.7.0/5.7/gcc_64--with-qt-includes=/opt/Qt5.7.0/5.7/gcc_64/include--with-qt-libraries=/opt/Qt5.7.0/5.7/gcc_64/lib
ERROR#7:
这次make完成后就可以看到图形界面了,但是播放了一个MP4格式的视频,提示不支持h64解码,当时编译成命令行版本的时候都是不存在这个问题的。
命令行:[00007f47ecc14210] main decoder error: cannot load plug-in/home/hcr/workspace
/vlc/modules/.libs/libavcodec_plugin.so:/home/hcr/workspace/vlc/modules/.libs/libavcodec_plugin.so:
undefined symbol: vaGetDisplayDRM
[00007f47ecc14210]main decoder error: Codec `h264' (H264 - MPEG-4 AVC (part 10)) is notsupported.
图形界面:Codec not supported:
VLCcould not decode the format "h264" (H264 - MPEG-4 AVC (part 10))
我感觉可能是VLC的libavcodec_plugin.so模块没有编译好,可能是因为ffmpeg编译的时候没有设置好参数,这次在ffmpeg编译的时候: ./configure --enable-gpl --enable-version3 --enable-nonfree--enable-pic --enable-shared --enable-static --enable-libx264 --enable-libx265 我记得上一次好像是没加参数的,这次特别注意了—enable-libx264
这次编译完基本就OK了。