请移步https://higoge.github.io/,所有下载资料在那个博客都能找到。谢谢。
--------------------------------------------------------------------
经常有朋友问Jeremiah怎么缩减VLC使用的FFMPEG的库,这个说难不难,说简单也不简单。经过两天的研究,修改了几个错误,把VLC-1.0.5使用的ffmpeg重新编译了,并添加到VLC-1.0.5中,现在就将过程记录下来,供大家参考。
环境:
1. Cygwin-new(20081208)
2. VLC-1.0.5
3. contribs-1.0.2-gcc-4.2.1-sjlj-runtime-3.15.2-only.tar.bz2
1. 获取修改VLC的contrib的一般方法
本小节讲的很重要,如果要修改其他的库,只要记住本小节所讲的,一般都能修改好。
VLC源码当中都会提供获取编译contrib的脚本,但是,这个脚本不但要从网上下载源码,进行编译,而且,还经常会编译出错。所以,一般不会直接执行这个脚本,而是参考这个脚本自己去下载源码自己去编译,自己替换。
此脚本就是extras/contrib/src/Makefile,如果大家有兴趣,就去读这个Makefile是什么意思,自己抠取里面有用的信息。当然这是最笨的办法。此处提供一个聪明的办法。
在extras/contrib/下执行:
./bootstrap
cd src
make -n > contrib-debug.txt 2>&1
make -n其实就是不是真正执行make,而只是打印执行的信息。我们将这个信息打印到contrib-debug.txt中,方便我们查看。
contrib-debug.txt关于ffmpeg的获取编译如下:
/usr/bin/svn co svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg -r 20342
(cd ffmpeg; patch -p0 < ../Patches/ffmpeg-svn-win32.patch)
(cd ffmpeg; patch -p1 < ../Patches/eac3_spectral.patch)
/usr/bin/wget -c --passive http://user.cs.tu-berlin.de/~jutta/gsm/gsm-1.0.12.tar.gz
rm -rf gsm || true
gunzip -c gsm-1.0.12.tar.gz | tar xf - --exclude='[*?:<>\|]'
mv gsm-1.0-* gsm || true
(patch -p0 < Patches/gsm-cross.patch)
(cd gsm; CC="gcc -mno-cygwin -isystem /usr/include/mingw" CXX="g++ -mno-cygwin -isystem /usr/include/mingw" make && cp inc/gsm.h /home/vss/vlc-1.0.5/extras/contrib/include && cp lib/libgsm.a /home/vss/vlc-1.0.5/extras/contrib/lib)
touch .gsm
(cd ffmpeg; CC="gcc -mno-cygwin -isystem /usr/include/mingw" CXX="g++ -mno-cygwin -isystem /usr/include/mingw" ./configure --target-os=mingw32 --enable-memalign-hack --cpu=i686 --arch=i686 --enable-libmp3lame --enable-libgsm --disable-debug --enable-gpl --enable-postproc --disable-ffserver --disable-ffmpeg --disable-ffplay --disable-devices --disable-protocols --disable-network --disable-bzlib --disable-decoder=dca --enable-w32threads --prefix=/home/vss/vlc-1.0.5/extras/contrib --extra-cflags="-I/home/vss/vlc-1.0.5/extras/contrib/include -mno-cygwin -isystem /usr/include/mingw -DNDEBUG -mno-cygwin -isystem /usr/include/mingw -isystem /home/vss/vlc-1.0.5/extras/contrib/include " --extra-ldflags="-L/home/vss/vlc-1.0.5/extras/contrib/lib -mno-cygwin" --target-os=mingw32 --enable-memalign-hack --cpu=i686 --arch=i686 --enable-libmp3lame --enable-libgsm --disable-debug --enable-gpl --enable-postproc --disable-ffserver --disable-ffmpeg --disable-ffplay --disable-devices --disable-protocols --disable-network --disable-bzlib --disable-decoder=dca --enable-w32threads --disable-shared --enable-static && make && make install-libs install-headers)
touch .ffmpeg
仔细读读上面的命令,无非就是svn到ffmpeg的代码,版本好是20342,打了两个补丁,获取到gsm代码,打了一个补丁,编译,安装,编译ffmpeg的库,安装。我们就照着这么去做。
对于其他库的编译安装,完全可以按照这个方式来。这个是宝贵的经验啊。恩,确实~~~
先在/home/yourname下面建立临时contrib文件夹。
mkdir mycontrib
cd mycontrib
mkdir include
mkdir lib
cd ~
2. gsm库的编译安装
上面make调试信息中的gsm下载地址ms不能用,我们可以自己去下载:http://www.imagemagick.org/download/delegates/ffmpeg/gsm-1.0.12.tar.gz
解压到/home/yourname下面。将VLC-1.0.5源码下面的extras/contrib/src/Patches下面的gsm-cross.patch也复制到/home/yourname下面。执行:
mv gsm-1.0-pl12 gsm
patch -p0 < ./gsm-cross.patch
修改gsm/Makefile的100行,加入rm的参数-rf
RMFLAGS = -rf
删除gsm/Makefile的300行,不需要执行ranlib命令。因为已经用了ar命令了。
$(RANLIB) $(LIBGSM)
修改完成,编译。
CC="gcc -mno-cygwin -isystem /usr/include/mingw" CXX="g++ -mno-cygwin -isystem /usr/include/mingw" make
复制库到临时文件夹。
cp inc/gsm.h /home/yourname/mycontrib/include && cp lib/libgsm.a /home/yourname/mycontrib/lib
3. ffmpeg的编译安装
按照make调试信息中ffmpeg的获取方法为:
/usr/bin/svn co svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg -r 20342
有些朋友可能没装svn客户端,或者要经过代理才能上网,配置svn代理有些麻烦,故我在本人公共邮箱提供了ffmpeg的20342版本下载,请见最后。解压到/home/yourname当中。将VLC-1.0.5源码下面的extras/contrib/src/Patches下面的eac3_spectral.patch也复制到/home/yourname中。此处没有复制ffmpeg-svn-win32.patch,因为ffmpeg-svn-win32.patch是让ffmpeg检查mingw-runtime的版本从3.15降低为3.13,对我们木有用,故此处不复制。
执行以下命令:
cd ffmpeg
patch -p1 < ../Patches/eac3_spectral.patch
修改configure的2720行,增加如下代码:
echo "#define FFMPEG_LICENSE \"$(c_escape $license)\"" >> $TMPH
修改libswscale/swscale.c的81行,修改pixdesc.h头文件路径为:
#include "libavcodec/pixdesc.h"
修改libavcodec/pixdesc.c和libavcodec/pixdesc.h,将
const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB] =
的定义(一大坨代码)从libavcodec/pixdesc.c移到libavcodec/pixdesc.h的
#endif /* AVCODEC_PIXDESC_H */
之前。
将以下脚本保存为mycfg.sh
CC="gcc -mno-cygwin -isystem /usr/include/mingw" \
CXX="g++ -mno-cygwin -isystem /usr/include/mingw" \
./configure \
--target-os=mingw32 --enable-memalign-hack --cpu=i686 --arch=i686 \
--disable-libmp3lame --enable-libgsm --disable-debug \
--enable-gpl --enable-postproc --disable-ffserver --disable-ffmpeg \
--disable-ffplay --disable-devices --disable-protocols --disable-network \
--disable-bzlib --disable-decoder=dca --enable-w32threads \
--prefix=/home/vss/mycontrib \
--disable-shared --enable-static \
--extra-cflags="-I/home/yourname/mycontrib/include -mno-cygwin -isystem /usr/include/mingw -DNDEBUG" \
--extra-ldflags="-L/home/yourname/mycontrib/lib -mno-cygwin"
需要说明的是:这里Jeremiah把libmp3lame给disable了,因为没有去下载编译libmp3lame,有需要的还是参考make的调试信息编译调试后,将libmp3lame给enable。另外,上面的脚本中--extra-flag及--extra-ldflag及--prefix中有/home/yourname/mycontrib路径根据个人情况修改。
执行:
sh mycfg.sh && make && make install-libs install-headers
这样ffmpeg的库就编译安装好了。
4. 替换contrib的库。
将/home/yourname/mycontib/lib下面的所有文件覆盖到/usr/win32/lib下面。然后就可以重新编译VLC-1.0.5了。
正规的做法是还要将/home/yourname/mycontib/include下面的所有头文件覆盖到/usr/win32/include下,不过我们自己编译得到的头文件的版本和contrib里面的头文件版本应该是一样的,所以此处这一步省了。
5. 写在最后
如果想精简VLC的libavcodec,libavformat的库,在ffmpeg的编译脚本中,去掉disable不用的编码及解码模块,这个要根据个人的需求来做,在此Jeremiah就不写了,因为我木有这方面的需求。嚯嚯~
提供Jeremiah修改好的ffmpeg-20342及gsm-1.0.12到我的公共邮箱中,不过还是希望各位不要图省事,直接拿来用,最好还是自己求修改,打补丁。因为这个过程是一个非常好学习的过程。
我的公共邮箱提供了下载,具体下载方式为:
1). 登录http://mail.qq.com
2). 用户名:jeremiah_vlc
3). 密码:发邮件给我([email protected]),我会告知。
4). 在“我的文件夹”的“Jeremiah_VLC相关资源”有所有资料的超大附件连接。