VLC-1.0.0正式版已经发布。Jeremiah抽空编译测试了一下,发现没啥太大问题,比较好用,也更加人性化,增加了buffer的显示和历史输入的提示。在这Jeremiah想把VLC-1.0.0的编译过程写详细一些,省得大家再往前翻看以前的博客了。
2009-07-30更新:vlc-1.0.1编译,与vlc-1.0.0编译相同,提供vlc-1.0.1源码下载地址。
2010-04-15更新:vista或win7下面使用cygwin可能出现fork不出来的现象,解决方法见第8步。感谢vlc研究2群hali的提醒和帮助。
1. Cygwin的安装
Jeremiah继续使用Cygwin-new(20081208)版。最新的Cygwin应该也问题不大。Cygwin-new(20081208)在我的公共邮箱提供了下载,具体下载方式为:
1). 登录
http://mail.qq.com
4). 在“我的文件夹”的“Jeremiah_VLC相关资源”有所有资料的超大附件连接。
安装过程中选择包为
Archive
unzip
zip
Devel
autoconf
automake
binutils
cvs
gcc
gcc-core
gcc-g++
gcc-mingw
gcc-mingw-core
gcc-mingw-g++
gdb
gettext
gettext-devel
git
libiconv
libgcrypt-devel
libtool
make
mingw-runtime
nasm
patchutils
pkg-config
subversion
Editor
vim
Libs
expat
libgcrypt
Web
curl
wget
2. 源码及库
vlc-1.0.0源码:http://download.videolan.org/pub/videolan/vlc/1.0.0/vlc-1.0.0.tar.bz2
vlc-1.0.1源码:http://download.videolan.org/pub/videolan/vlc/1.0.1/vlc-1.0.1.tar.bz2
库:http://download.videolan.org/pub/videolan/vlc/1.0.0/win32/contrib-1.0.0.tar.bz2
解压源码到~(/home/yourname)下,解压库到/下。这里的解压都可以直接用winrar解压,不过要选对目录哟,源码是解压在X:/cygwin/home/yourname下面,库是解压到X:/cygwin/下面。
3. 一点点清理工作
删除/usr/win32/bin下面的moc,rcc,uic这三个文件,注意,保留moc.exe,rcc.exe,uic.exe。
4. bootstrap
cd到vlc-1.0.0中执行
成功后会显示
Successfully bootstrapped
5. configure
保存以下脚本为myvlc.sh
PATH=/usr/win32/bin:$PATH /
PKG_CONFIG_LIBDIR=/usr/win32/lib/pkgconfig /
CPPFLAGS="-I/usr/win32/include -I/usr/win32/include/ebml" /
LDFLAGS=-L/usr/win32/lib /
CC="gcc -mno-cygwin" CXX="g++ -mno-cygwin" /
./configure /
--host=i686-pc-mingw32 /
--enable-nls --enable-sdl --with-sdl-config-path=/usr/win32/bin /
--enable-avcodec --enable-avformat --enable-swscale /
--enable-faad --enable-flac --enable-theora /
--enable-freetype /
--enable-fribidi /
--enable-live555 --with-live555-tree=/usr/win32/live.com /
--enable-caca --with-caca-config-path=/usr/win32/bin /
--with--config-path=/usr/win32/bin /
--with-dvdnav-config-path=/usr/win32/bin /
--disable-cddax --disable-vcdx --enable-goom /
--enable-twolame --enable-dvdread /
--enable-debug --enable-dca /
--disable-mkv --disable-taglib /
--disable-zvbi /
--enable-mozilla --with-mozilla-sdk-path=/usr/win32/gecko-sdk
执行
成功后会显示
libvlc configuration
--------------------
version : 1.0.0
system : mingw32
architecture : i686 mmx sse sse2
build flavour : debug devel
vlc aliases : cvlc rvlc svlc qvlc
plugins/bindings : activex mozilla
You can tune the compiler flags
in vlc-config.
To build vlc and its plugins, type `./compile' or `make'.
6. 修改工作
(1) 修改libtool第144行。
修改
global_symbol_pipe=""
为
global_symbol_pipe="sed -n -e 's/^.*[ ]//([ABCDGIRSTW][ABCDGIRSTW]*//)[ ][ ]*//(//)//([_A-Za-z][_A-Za-z0-9]*//)/$///1//2//3 //3/p'"
(2) 注释掉Makefile.am第700,730,741行,就是行首加入#。
# cp "$(top_srcdir)/extras/package/win32/vlc.exe.manifest" "$(win3
2_destdir)/"
# cp $(top_srcdir)/projects/mozilla/npvlc.dll.manifest $(win32_des
tdir)/mozilla/
# cp $(top_srcdir)/projects/activex/axvlc.dll.manifest $(win32_des
tdir)/activex/
(3) 修改share/Makefile.am第1行,share/Makefile第639行,share/Makefile.in第639行。
修改
MOSTLYCLEANFILES = $(nobase_vlcdata_DATA)
为
MOSTLYCLEANFILES = skins2/default.vlt
注意行数可能不对,请对照着改。
解释下这些错误的修改。
第一个错误主要是一个正则表达式,libtool的问题。
第二个错误因为在执行make package-win32-base的时候,会提示找不到某些manifest文件,所以注释掉,让它在打包的时候不去cp这些manifest。
第三个错误是vlc-1.0.0特有的。主要是执行make clean后再次make会出现No rule to make target `skins2/fonts/FreeSans.ttf'的错误。主要是clean的时候把FreeSans.ttf等文件给删除了,这样的修改防止了错误删除。
7. make
执行
应该不会报错,成功后,执行
就此搞定!
8. vista或win7有可能出现fork不出来的错误,如下:
8928 [main] perl 4540 C:/cygwin/bin/perl.exe: *** fatal error - unable to remap C:/cygwin/li
b/perl5/5.10/i686-cygwin/auto/File/Glob/Glob.dll to same address as parent(0x910000) != 0x9F000
0
8 [main] perl 4476 fork: child 4540 - died waiting for dll loading, errno 11
参考官网的解决方法:
It might fail with some unable to remap error . It seems you need to rebase all Cygwin DLLs: close all your cygwin applications and launch 'ash' from basic windows command prompt (Start -> Run -> cmd), from there run rebaseall (so start e.g. C:/cygwin/bin/ash.exe and type there text below).
/bin/rebaseall -v
也就是在cmd下面运行
然后在里面执行
将cygwin所有使用的dll重新rebase一遍,就能解决问题。
windows平台下vlc编译之十一:vlc-1.0.2的编译
很久没有更新博客了,最近Jeremiah确实有些忙,而且,也没有再对VLC进行深入研究。现在把最新的VLC-1.0.2版本的编译说一下。与VLC-1.0.0及VLC-1.0.1的差不多。在此从略写。
请主要参考《windows平台下vlc编译之十:vlc-1.0.0的编译》。
2009.11.04更新:vlc-1.0.3编译。与vlc-1.0.2相同,只添加源码地址。
2009.12.16更新:vlc-1.0.4源码发布,但是根据官网上的信息,vlc-1.0.4只是对基于X11的操作系统进行了Bug修复。所以Windows的和Mac就没有进行新的修复。在此只提供源码。
(This release is targetted at fixing bugs on the x11 platforms, fixing bugs especially for KDE, cairo-dock, XCB, v4l and FreeBSD compatibility. Binaries for Windows and Mac OS are not yet on the pipe.)
2010.02.05更新:vlc-1.0.5编译。与vlc-1.0.2相同,只添加源码地址。
2010.04.22更新:vlc-1.0.6编译。与vlc-1.0.2基本相同,增加一个x264.c的修改,见最后。添加源码地址。
具体每版更新信息请参考:http://www.videolan.org/developers/vlc-branch/NEWS
1. 源码及库
vlc-1.0.2源码:
http://download.videolan.org/pub/videolan/vlc/1.0.2/vlc-1.0.2.tar.bz2
vlc-1.0.3源码:http://download.videolan.org/pub/videolan/vlc/1.0.3/vlc-1.0.3.tar.bz2
vlc-1.0.4源码:http://download.videolan.org/pub/videolan/vlc/1.0.4/vlc-1.0.4.tar.bz2
vlc-1.0.5源码:http://download.videolan.org/pub/videolan/vlc/1.0.5/vlc-1.0.5.tar.bz2
vlc-1.0.6源码:http://download.videolan.org/pub/videolan/vlc/1.0.6/vlc-1.0.6.tar.bz2
库:
http://download.videolan.org/pub/videolan/vlc/1.0.2/contribs-1.0.2-gcc-4.2.1-sjlj-runtime-3.15.2-only.tar.bz2
2. configure脚本
PATH=/usr/win32/bin:$PATH /
PKG_CONFIG_LIBDIR=/usr/win32/lib/pkgconfig /
CPPFLAGS="-I/usr/win32/include -I/usr/win32/include/ebml" /
LDFLAGS=-L/usr/win32/lib /
CC="gcc -mno-cygwin" CXX="g++ -mno-cygwin" /
./configure /
--host=i686-pc-mingw32 /
--enable-nls --enable-sdl --with-sdl-config-path=/usr/win32/bin /
--enable-avcodec --enable-avformat --enable-swscale /
--enable-faad --enable-flac --enable-theora /
--enable-freetype /
--enable-fribidi /
--disable-fluidsynth /
--enable-live555 --with-live555-tree=/usr/win32/live.com /
--enable-caca --with-caca-config-path=/usr/win32/bin /
--with-dvdnav-config-path=/usr/win32/bin /
--disable-cddax --disable-vcdx --enable-goom /
--enable-twolame --enable-dvdread /
--enable-debug --enable-dca /
--disable-mkv --disable-taglib /
--disable-zvbi /
--enable-mozilla --with-mozilla-sdk-path=/usr/win32/gecko-sdk
本次新的configure脚本主要删除了无效的配置,及加入了--disable-fluidsynth,否则编译不过。
3. 修改错误
《windows平台下vlc编译之十:vlc-1.0.0的编译》的第6步的错误(1),(2)的错误还是要修改,(3)可以不用了。
但是要修改以下错误。
修改MakeFile的1970行:
echo "Error: please remove $(win32_debugdir), it is in the way"; /
false /
为
echo "Error: please remove $(win32_debugdir), it is in the way"; /
rm -rf $(win32_debugdir) /
解释下:这个错误主要是由于最后执行make package-win32-base后会产生一个symbols-1.0.2文件夹,而这个文件夹在下次执行
make package-win32-base的时候提示存在,然后会报错,就是上面的false,将其改为删除此文件夹,不报错继续。
2010-04-22更新:vlc-1.0.6错误修改
由于官方使用了较新的x264的库,而没有给出相应的contrib,1.0.2的contrib中x264有些过时,没有x264_encoder_delayed_frames函数。vlc-1.0.6还好只是一句打印信息用到了此函数,故注释之。
注释掉vlc-1.0.6的modules/codec/x264.c的1643行:
// msg_Dbg( p_enc, "framecount still in libx264 buffer: %d", x264_encoder_delayed_frames( p_sys->h ) );
其他就没什么问题了,编译过VLC好几遍的对修改此问题都是轻车熟路了。没有编译过VLC的请下载视频观看。下载方式请看以前的博客。
windows平台下vlc编译之十二:用GDB调试vlc
本着开源的精神,本着能让大家更好的学习vlc,使用vlc,今天Jeremiah写一篇重量级的博客,用GDB调试vlc。
很多人尝试过用GDB调试vlc,但都失败了,主要是官方博客给出的调试方法不好用,只能在winvlc.c文件中调试,不能调试其他文件。Jeremiah也是经过了很久的研究,终于在身边一位高手的帮助下,实现了对vlc的调试。在此对身边这个高手表示感谢。
调试前提:
1) 对编译vlc有所了解,最好是编译成功过。由于用GDB调试vlc需要重新编译vlc,所以必须对编译vlc比较熟悉。本篇以vlc-1.0.5为例。如不清楚如何编译vlc的请参考《windows平台下vlc编译之十一:vlc-1.0.2的编译》及Jeremiah自己录制的编译vlc视频。
2) 对GDB有所了解,至少应该知道怎么用。如果不知道,去Google吧,一堆堆的资料。
闲言少叙,进入正题。
1. 执行./bootstrap之前,修改vlc-1.0.5的Makefile.am和Makefile.in文件,去掉以下内容:(直接删除掉)
# Rebase all those DLLs to speed up loading (need cygwin rebase)
if rebase -b 0x42 /dev/null >/dev/null 2>&1; then /
find $(win32_destdir) -type f -name '*.dll' -print | rebase -b 0x70000000 -T -; /
fi
2. 修改myvlc.sh的CC和CXX变量,加入-g。
CC="gcc -mno-cygwin -g" CXX="g++ -mno-cygwin -g"
3. 执行脚本,修改错误,执行make,这些都请参考以前博客。
4. make成功后不要执行make package-win32-base。而是执行以下命令。
make package-win32-base-debug
5. 现在就可以调试了。
显示如下:
6. 设置断点。
给vlc设置断点其实让Jeremiah头晕了很长时间,但最后终于搞定了。先打印下看看。输入l。
设置断点可以用b function_name的形式,但vlc里面重名函数太多,所以此方法不太好用。
采用另外的方式,b fine_name:line_number的形式,vlc里面重名的文件名是很少的,所以这样的方法可以很有效的设置断点。一开始设置会提示找不到,输入y让其记录就行了。此处举例设置avcodec.c的211行,OpenDecoder函数,即调试plugins/libavcodec_plugin.dll的代码。
7. 执行程序,输入视频路径地址。
run d:/video/01.avi
会执行到libvlc_new之后停住。
按c继续执行后会在avcodec.c的OpenDecoder函数停
住。
通过这样的方式就可以进行调试了,比如用s或n进行单步调试。
祝各位清明节快乐。