標籤:extra 參考 mod 動態 include time mingw 做了 朋友
寫在前面
FFmpeg是一個開源且跨平台的音視頻解決方案,集採集、轉碼、流式化為一身,項目的libavcodec編解碼模組和libavformat媒體格式模組,支援非常非常豐富的編解碼格式和容器封裝格式,是做媒體相關開發工作必須要掌握和借鑒的一個項目。定製和編譯ffmpeg是做流媒體開發遲早要面對的,linux平台上相對簡單,windows平台就比較麻煩了。本文的目的就是詳細介紹下如何基於ubuntu交叉編譯環境,編譯和定製ffmpeg。
一 概述
ffmpeg主要是基於linux開發,當然它也支援windows,不過並不支援visual studio系列IDE(因為它使用了大量C99特性,而vs不支援C99),所以要想在windows上使用,必須要通過mingw或cygwin來編譯,或者在linux上構建windows交叉編譯環境,後者要簡單些。這裡有個網站http://ffmpeg.zeranoe.com/,作者提供了ffmpeg已經編譯好的windows版本,包括靜態串連的,動態串連的,以及sdk,基本上隔幾天就編譯一次。大家可以先上去看一下,如果它編譯的符合你的需求(上次看的時候它好像沒有加入libfaac,現在不知道了),而你又懶得編譯,就可以使用它的。對linux不太熟悉的朋友可能不太想繼續往下看,請不要擔心,ubuntu的安裝和使用非常簡單,直接在虛擬機器裡使用就行。編譯的時候,你也只需要使用幾個很簡單的命令而已。
二 環境準備
1. Ubuntu Linux,本人使用的Ubuntu 11.10,安裝在VMware Workstation中
2. MinGW編譯環境,我們要非常感謝,zeranoe,它做了一個自動下載和編譯ffmpeg所需要的mingw及其他工具鏈的指令碼,請到http://ffmpeg.zeranoe.com/blog/下載最新的“MingGW-w64 Build Script 2.8.2”。解壓後建立一個目錄把它放進去(本人的目錄是/home/haibindev/studio/mingw-w64/),然後開啟終端,cd 到MinGW-w64所在目錄,執行"chmod +x mingw-w64-build-2.8.2",使這個指令碼可以執行。之後運行"./mingw-w64-build-2.8.2",就可以按照提示來做了。如果它提示你缺少依賴庫,就按照它的提示先安裝依賴庫,方式是,執行"sudo apt-get install 庫名字"。
3. 設定終端的環境變數
執行一下命令即可。(注意,如果你關閉了終端,或者建立一個終端,需要重新執行一下這個命令。)
export PATH="$PATH:/home/haibindev/studio/mingw-w64/mingw-w64-i686/bin"
三 下載FFmpeg源碼和你需要的編解碼庫的源碼
這點不用做什麼介紹,先到ffmpeg官網,下載ffmpeg原始碼,然後再Google你需要的編解碼庫,到相關網站下載即可。本人這次編譯共下載了以下代碼,以做大家參考。
libx264 libfaac libmp3lame libopenjpeg libogg libspeex libvorbis libtheora libxvid ffmpeg
下載完後解壓,然後統一放到一個目錄中,本人的目錄是/home/haibindev/studio/opensource/。是全家福(build-ffmpeg是編譯ffmpeg的工作目錄,下面介紹,freetype我沒有編譯)。
四 編譯
為了方便,我把所有庫編譯後的結果都存放到了一個統一的目錄/home/haibindev/opensdk,方法請見下面的編譯命令。
除了第一個命令以外,其餘的都是configure命令,執行完之後,還需要執行make命令,然後執行make install。我就不再寫出來了。
1. 先執行以下命令
ln -s "/usr/bin/pkg-config" /home/haibindev/studio/mingw-w64/mingw-w64-i686/bin/i686-w64-mingw32-pkg-config
2. libx264
./configure --enable-static --enable-win32thread --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --cross-prefix=i686-w64-mingw32-
3. libfaac
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared --with-mp4v2=no
4. libmp3lame
CFLAGS=-DFORCEINLINE= ./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared --disable-frontend
5. libopenjpeg
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared
6. libogg
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared
7. libspeex
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared --disable-oggtest
8. libvorbis
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared --disable-oggtest
9. libtheora
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared --disable-oggtest --disable-vorbistest --disable-sdltest --with-ogg-includes=/home/haibindev/opensdk/include --with-ogg-libraries=/home/haibindev/opensdk/lib
10. libxvid
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --disable-pthread
11. ffmpeg
先建立/home/haibindev/studio/opensource/build-ffmpeg,然後cd到該目錄,執行
../ffmpeg-0.8.7/configure --disable-static --enable-shared --enable-version3 --enable-gpl --enable-nonfree --disable-pthreads --enable-w32threads --enable-runtime-cpudetect --enable-memalign-hack --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-cross-compile --target-os=mingw32 --arch=x86 --prefix=/home/haibindev/opensdk/ffmpeg --cross-prefix=i686-w64-mingw32- --extra-cflags="-I/home/haibindev/opensdk/include" --extra-ldflags="-L/home/haibindev/opensdk/lib"
注意,編譯xvid時需要先編輯configure檔案,然後刪除裡面的“-mno-cygwin”欄位,否則make會失敗,提示-mno-cygwin無效。libmp3lame命中中最前面的“CFLAGS=-DFORCEINLINE= ”是為了防止mp3lame中的一個編譯錯誤,要記得帶上。
以上編譯成功之後,ffmpeg win32 sdk就出現在/home/haibindev/opensdk/ffmpeg裡面了,bin目錄下就是我們需要的所有檔案了。
五 驗證編譯後的程式
拷貝到windows上,在命令中運行ffmpeg.exe,看
驗證一下,做個轉碼操作就行了,執行
ffmpeg.exe -i s.avi -vcodec libx264 -acodec libfaac s.mp4
運行正常,產生了264編碼和aac編碼的,mp4檔案,播放正常,ok了。
六 最後說一下
請大家編譯的時候千萬別忘了configure之後,要執行make和make install!另外,一定要看清楚我貼出來的命令,把我的目錄,換成你的目錄,不要直接拷貝,那是不行的,因為你不叫haibindev:)。如果有的庫在make的時候出現了編譯錯誤,簡單修改一下源檔案就能搞定。
ffmpeg有很多配置選項,你可以對它深度定製,可以把avcodec編譯得很小,大家可以自己研究。
基於Ubuntu交叉編譯FFmpeg Windows SDK