寫在前面html
FFmpeg是一個開源且跨平臺的音視頻解決方案,集採集、轉碼、流式化爲一身,項目的libavcodec編解碼模塊和libavformat媒體格式模塊,支持很是很是豐富的編解碼格式和容器封裝格式,是作媒體相關開發工做必需要掌握和借鑑的一個項目。定製和編譯ffmpeg是作流媒體開發早晚要面對的,linux平臺上相對簡單,windows平臺就比較麻煩了。本文的目的就是詳細介紹下如何基於ubuntu交叉編譯環境,編譯和定製ffmpeg。linux
一 概述ubuntu
ffmpeg主要是基於linux開發,固然它也支持windows,不過並不支持visual studio系列IDE(由於它使用了大量C99特性,而vs不支持C99),因此要想在windows上使用,必需要經過mingw或cygwin來編譯,或者在linux上構建windows交叉編譯環境,後者要簡單些。這裏有個網站http://ffmpeg.zeranoe.com/,做者提供了ffmpeg已經編譯好的windows版本,包括靜態鏈接的,動態鏈接的,以及sdk,基本上隔幾天就編譯一次。你們能夠先上去看一下,若是它編譯的符合你的需求(上次看的時候它好像沒有加入libfaac,如今不知道了),而你又懶得編譯,就可使用它的。對linux不太熟悉的朋友可能不太想繼續往下看,請不要擔憂,ubuntu的安裝和使用很是簡單,直接在虛擬機裏使用就行。編譯的時候,你也只須要使用幾個很簡單的命令而已。windows
二 環境準備frontend
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. 設置終端的環境變量ui
執行一下命令便可。(注意,若是你關閉了終端,或者新建一個終端,須要從新執行一下這個命令。)編碼
export PATH="$PATH:/home/haibindev/studio/mingw-w64/mingw-w64-i686/bin"
三 下載FFmpeg源碼和你須要的編解碼庫的源碼spa
這點不用作什麼介紹,先到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編譯得很小,你們能夠本身研究。