vlc的第三方庫contrib的修改之二:ffmpeg的庫的修改

請移步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相關資源”有所有資料的超大附件連接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章