zoukankan      html  css  js  c++  java
  • vlc的第三方库contrib的修改之二:ffmpeg的库的修改

    经常有朋友问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到我的公共邮箱中,不过还是希望各位不要图省事,直接拿来用,最好还是自己求修改,打补丁。因为这个过程是一个非常好学习的过程。
        我的公共邮箱提供了下载,具体下载方式为:
    2). 用户名:jeremiah_vlc
    3). 密码:发邮件给我(
    jeremiah.vlc@gmail.com),我会告知。
    4). 在“我的文件夹”的“Jeremiah_VLC相关资源”有所有资料的超大附件连接。
  • 相关阅读:
    线程安全
    转 接口和抽象类 虚方法 有什么区别
    转 面向对象的三个基本特征
    转载 泛型
    遍历list,字典
    转 拉姆达表达式,委托、匿名方法、Lambda表达式的演进
    int byte转换
    委托,匿名方法
    带参数线程,不带参数线程
    const readonly
  • 原文地址:https://www.cnblogs.com/qq78292959/p/2076950.html
Copyright © 2011-2022 走看看