天天看點

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.p_w_picpathmagick.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的擷取方法為:

    有些朋友可能沒裝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相關資源”有所有資料的超大附件連接配接。