為了編譯這個(gè)東西,快折騰了一個(gè)星期了。期間經(jīng)歷了很多痛苦的過程,今天我把整個(gè)過程,以及在這個(gè)過程的感悟?qū)懴聛恚詡淙蘸蟛榭?,也希望能幫到一些像我一樣的兄弟姐妹?/p>
在這一個(gè)星期里前前后后加起來總共使用了3中方式編譯ffmpeg
1. 在基于linux內(nèi)核的操作系統(tǒng)中編譯。這種方式很簡單,也很順利。
2. 在windows下, 采用cygwin編譯,這種方法稍微復(fù)雜一點(diǎn)。
3. 在windows下,采用MinGW + MSys編譯,這種方法是這三個(gè)方法中最為復(fù)雜的一種。涉及的東西也最多,花費(fèi)的時(shí)間也最長。
下面就這個(gè)三種方法詳細(xì)介紹一二。
我所選用ffmpeg source code 的版本是0.6,可以以下連接獲取。
http://www.ffmpeg.org/releases/ffmpeg-0.6.tar.gz
我所用的操作系統(tǒng)是ubuntu, 將下載ffmpeg的源碼放在/home目錄下面。或者你也可以用svn從服務(wù)器上checkout ffmpeg的代碼。ubuntu默認(rèn)情況下是沒有安裝svn,但是你可以通過一個(gè)非常的簡單的命令就完成安裝,命令是sudo apt-get subversion。前提是你可以訪問因特網(wǎng)。這個(gè)過程大約需要幾分鐘,具體的時(shí)間跟你的網(wǎng)絡(luò)狀況有關(guān)系。
打開終端,進(jìn)入ffmpeg目錄。依次輸入以下命令:
./configure --enable-memalign-hack --disable-debug
make
你也可以將2條命令合成一條,一次性執(zhí)行完成。
./configure --enable-memalign-hack --disable-debug && make
當(dāng)命令完成之后你就可以在ffmpeg的目錄下找到8個(gè)可執(zhí)行程序:
ffmpeg.exe
ffmpeg_g.exe
ffprobe.exe
ffprobe_g.exe
ffplay.exe
ffplay_g.exe
ffserver.exe
ffserver_g.exe
每個(gè)可執(zhí)行程序有一個(gè)_g的相對應(yīng)。這個(gè)帶調(diào)試信息的可執(zhí)行程序。
這樣編譯任務(wù)完成。
似乎很順利, 接下來我們輕松一下,用我們編譯出來的成果來看個(gè)電影,敲入如下命令:
./ffplay /media/downdriver/hly.mp4
然而我們被告知:
Could not initialize SDL library: No avaiable video device
這是怎么回事呢? 原來我的系統(tǒng)中沒有安裝x11的庫文件, 因此編譯出來的SDL庫就沒有加載視頻設(shè)備的能力了。那接下來我們首先下載對應(yīng)x11的庫文件,然后重新編譯SDL, 那么有沒有必要重新編譯ffmpeg呢, 沒有必要。
下載庫文件:
sudo apt-get install libx11-dev
下載必要的頭文件:
sudo apt-get install xorg-dev
安裝成功后,再次進(jìn)入sdl源代碼目錄重新編譯, 不要忘了首先執(zhí)行:
make clean
接著是:
./configure
make && make install
再來一次:
./ffplay /media/downdriver/hly.mp4
呵呵,成功了,看到我們的視頻了...
首先安裝Cygwin, 通過以下連接獲?。?/p>
http://www.cygwin.com/setup.exe
這種方式的安裝過程,最復(fù)雜,和最耗時(shí)的就在安裝Cygwin上了。setup.exe下載非常簡單也很快,都不到1M. 但是這只是下載了安裝的包的客戶端。接下來的安裝是通過setup.exe從官方網(wǎng)站下載安裝包。速度會很慢,并且根據(jù)你所選的包種類,大小不一樣。如果全部選中那么你將要下載的總大小在六七百M(fèi)以上。也許你覺得不大,但是當(dāng)我告訴你速度下載的速度很慢時(shí),并且經(jīng)常會出現(xiàn)下載到半截就死活不動了。(至少在中國很慢,不光是我有這種感受,在網(wǎng)上看到很多人都有這個(gè)問題,甚至有位網(wǎng)友為了解決這個(gè)網(wǎng)速慢和下載不動的情況,自己研究一套方案)。并且如果全選安裝后會吃掉你兩三個(gè)G的空間。我們只是編譯ffmpeg,所以沒有必要全選,只選devel這個(gè)就可以了(忘了說怎么進(jìn)行安裝,由于安裝向?qū)ё龅牟诲e,所以你只要按照向?qū)дf的一步一步往下走ok ,我這里只說其中關(guān)鍵的步驟)。另外在選mirror site的時(shí)候請選ftp://mirrors.kernel.org(如果你在中國這個(gè)網(wǎng)站可能會快一些)。為了下載我試過里面幾乎所有的網(wǎng)站,當(dāng)然如果你選用我推薦的這個(gè)網(wǎng)站,速度仍然很慢,你可以選用美國的那些鏡像。也許你會問我怎么知道那個(gè)是美國的鏡像,問得好,打開www.cygwin.com這個(gè)網(wǎng)站,這是cygwin的官方網(wǎng)站。在主頁的右面請點(diǎn)擊mirror site,那么現(xiàn)在你可以看到那些是美國的了。
好了,讓我們繼續(xù)。
假設(shè)你現(xiàn)在已經(jīng)安裝完成了cygwin的安裝。打開cygwin的命令窗口, 進(jìn)入ffmpeg 的目錄。
鍵入 ./configure --enable-memalign-hack --disable-debug 然后回車
等待幾分鐘后,看到執(zhí)行成功,祝賀你。接下來我們要執(zhí)行的命令是make.
但是當(dāng)你輸入make后發(fā)現(xiàn),提示你make不認(rèn)識。好,去 cygwin的bin目錄看看有沒有這個(gè)make.exe存在, 結(jié)果不存在,那我們?nèi)フ覀€(gè)一個(gè)最新的make.
這里有2個(gè)方法來解決這個(gè)問題,
1. 重新啟動cygwin的setup, 在安裝組件選擇界面中, 在最上方的文本框中輸入make, 下面就會相應(yīng)的顯示包,然后選擇安裝這個(gè)包,繼續(xù)完 成安裝.
2. 在網(wǎng)絡(luò)上找一個(gè)最新的make, 要求版本是3.81. 然后直接拷貝到 /cygwin/bin目錄.
好,現(xiàn)在再一次執(zhí)行命令make, 你會看到CC xxx, CC xxx之類的東西.說明已經(jīng)用gcc開始編譯了.
如果沒有什么編譯錯誤, 你可以在命令行的最后幾行看到ffmpeg.exe, ffserver.exe, ffprobe.exe
這說明成功了.
但是你會發(fā)現(xiàn)你沒有看到ffplay.exe
那是因?yàn)橐幾gffplay必須依賴于sdl庫,這同樣是一個(gè)opensource 的東西, 對應(yīng)的官網(wǎng)是http://www.libsdl.org. 這個(gè)庫負(fù)責(zé)一些輸入設(shè)備的事件以及界面的事情. 若想了解更多,請參看官網(wǎng).
接下來我們要做的是下載對應(yīng)的源代碼,編譯,安裝.
首先下載源代碼:
http://www.libsdl.org/release/SDL-1.2.14.tar.gz
下載完畢后拷貝到 /cygwin/home/下面.然后cygwin的窗口中進(jìn)入home目錄, 接著輸入tar -szvf sdl-1.2.14.tar.gz 這個(gè)命令是用來解壓我們剛才下載的文件的. 解壓完畢后, cd sdl-1.2.14進(jìn)入sdl的源代碼目錄. 執(zhí)行sh autogen.sh, 大約一分鐘后, 你會看到 you are ready to run confingure. 這個(gè)表示剛才那條命令執(zhí)行成功了. 并且告訴你下一條命令是configure. 好接下來我們輸入./configure命令.
這個(gè)需要幾分鐘的時(shí)間. 我在執(zhí)行這條命令時(shí)出錯,
***Your compiler (gcc) does not produce Win32 executables
google了一下, 找到一個(gè)解決辦法:
是在一個(gè)老外的網(wǎng)站看到的, 他是這樣寫的
$ chmod 755 /usr/bin/set-gcc-default-3.sh
$ /usr/bin/set-gcc-default-3.sh
但是當(dāng)輸入第一條命令后, 錯了, 說找不到set-gcc-default-3.sh. 我們?nèi)?yīng)目錄找找, 果然沒有. 并且usr目錄下竟然沒有bin這個(gè)目錄. 我猜是不是在/cygwin/bin下面, 果然在那里找到了. 從這個(gè)可以看到開源代碼一個(gè)很大的問題, 版本很穩(wěn)定. 變化很大. 也許我的這個(gè)編譯文檔過幾個(gè)月可能就不能用了.好了回到主題.
當(dāng)編譯完畢后需要將gcc的版本切換回來, 切換回4的命令如下:
$ chmod 755 /usr/bin/set-gcc-default-4.sh
$ /usr/bin/set-gcc-default-4.sh
這個(gè)命令是的作用是將gcc的版本轉(zhuǎn)換為3, 當(dāng)前版本是4. 因?yàn)閟dl要求的環(huán)境是3的.
接下來就是
make
make install
如果上面的命令執(zhí)行都沒有錯誤的話, 接下來我們要做的就是重來編譯我們的ffmpeg, 就是進(jìn)入ffmpeg的目錄,執(zhí)行
./configure --enable-memalign-hack --disable-debug
make
這里有個(gè)小技巧, 可以幫助我們在不執(zhí)行make命令的情況下, 判斷執(zhí)行make命令后我們能不能得到ffplay. 畢竟make需要超過10分鐘的時(shí)間. 就是在configure命令執(zhí)行完畢后查看結(jié)果的最初20行左右, 找到sdl support, 如果它的右邊寫的是yes, 那就說明我們可以得到ffplay,如果是no, 那就得不到ffplay.
我的結(jié)果是yes, 接下來執(zhí)行make, 還是有錯誤, __assert 沒有定義之類的錯誤.有人說把對應(yīng)的libavformat等文件下 .a文件刪除.然后用
./configure --enable-memalign-hack --disable-debug --enable-shared --disable-static
如果要編譯出ffserver,還需要加上--enable-network --enable-protocols --enable-muxers
到這里在cygwin下面的編譯就通過了.
順便解釋一下,如果你要編譯出動態(tài)庫,就要加上
--enable-shared
--enable-static
另外, --enable-memalign-hack是指編譯時(shí),使用內(nèi)存對齊方式,這樣以便編譯時(shí)用mmx或者sse指令對代碼進(jìn)行優(yōu)化。
make install
在這種編譯方式下是把編譯出來的文件拷貝到C:\cygwin\usr\local\bin目錄,要看你的cygwin安裝到什么地方,我的安裝在c盤,所以是C:\cygwin\。如果是后面的一種編譯方式,則是將編譯出來的文件拷貝到msys的安裝目錄,如我的是安裝到c盤,就是c:\msys\local\bin
ffmpeg編譯時(shí),還可以根據(jù)你cpu 核心的個(gè)數(shù),進(jìn)行編譯時(shí)間的優(yōu)化,也就是說當(dāng)你指定你的cpu為雙核時(shí),比你不指定編譯要快。例如指定2核心時(shí):
make -j2
這種編譯方式最為復(fù)雜, 也是花去我時(shí)間最多的一種.
首先去MinGW的官網(wǎng)下載安裝包.
官網(wǎng)是 www.mingw.org
安裝包的連接:
如果不可用去
http://sourceforge.net/projects/mingw/
下載.
MSYS的下載地址:
http://downloads.sourceforge.net/mingw/MSYS-1.0.10.exe
接下來就是安裝mingw和msys.安裝順序一定要是先安裝mingw再安裝msys.因?yàn)樵诎惭bmsys的過程中要你指定mingw的安裝目錄.
mingw的安裝沒有什么可說的, 就是采用默認(rèn)安裝, 不要更改它的默認(rèn)目錄, c:/mingw. 接下來安裝msys.
msys安裝過程中會問你是否已經(jīng)安裝了mingw, 敲入y然后回車
接著讓你輸入mingw的安裝目錄, 輸入c:/mingw, 注意是反斜扛.
這樣我們環(huán)境似乎準(zhǔn)備好了(之所以這么說, 是因?yàn)槲覀冊诤竺婢幾g的過程中會發(fā)現(xiàn)很多問題). 那么開始我們的編譯之旅吧.
在開始菜單中依次找到mingw->msys->msys.打開shell環(huán)境.
同樣需要進(jìn)入ffmpeg目錄. 有些人直接把ffmpeg拷貝到mingw的home目錄, 這樣進(jìn)入ffmpeg目錄很簡單. 只要在打開shell窗口后,輸入cd ffmpeg-0.6(這里ffmpeg-0.6是我放置ffmpeg的目錄). 就可以編譯了. 我是放在D盤. 因?yàn)楸救瞬幌矚g在系統(tǒng)盤下放太多的東西. 為了進(jìn)入本人的ffmpeg目錄需要這樣:
cd /d
cd downloadcode
cd ffmpeg-0.6
這里 /d 代表進(jìn)入d盤, 接著downloadcode文件夾, 再進(jìn)入ffmpeg-0.6
從這里可以看出在cygwin的shell下面和msys的shell下面還是有點(diǎn)不一樣.
好了, 我們執(zhí)行
./configure --enable-memalign-hack --disable-debug
沒有出錯
接著輸入
make
告訴我make不認(rèn)識, 看來遇到的是和windows+cygwin下面同樣的問題, 用同樣的方法解決.
成功的執(zhí)行完make后, 回到我們的ffmpeg文件下面看看, 編譯出來哪些東西.
發(fā)現(xiàn)只有ffprobe.exe ffmpeg.exe
沒有ffplay.exe, ffserver.exe
google后發(fā)現(xiàn), 有個(gè)老外碰到同樣的問題, 并給出了解決辦法. 從sdl的官網(wǎng)下載已經(jīng)編譯好的dll,連接如下:
http://www.libsdl.org/release/SDL-devel-1.2.14-mingw32.tar.gz
然后解壓, 將其中的bin, lib, include 3個(gè)文件夾拷貝到mingw的目錄下, 當(dāng)詢問是否覆蓋, 選擇是.
到bin目錄找到sdl-config.用ultraedit打開. 將PREFIX=后面的值改為c:/mingw
接下來, 編譯, 成功獲得ffplay.exe.
打開windows命令窗口(cmd.exe). 經(jīng)入ffmpeg目錄, 執(zhí)行ffplay.exe, 發(fā)現(xiàn)崩潰了, 提示gcc的版本太舊, 我暈, 真是有點(diǎn)太繁瑣了, 從網(wǎng)站下載最新的gcc集合. 連接如下:
http://cdnetworks-kr-1.dl.sourceforge.net/project/tdm-gcc/TDM-GCC%20Installer/tdm-gcc-4.5.0.exe
安裝后在c盤下找到mingw32文件夾, 這就是我們剛才安裝gcc, 進(jìn)入目錄將bin, inlude, lib 3個(gè)文件夾拷貝到mingw的目錄下, 當(dāng)詢問是否覆蓋, 選擇是.
再一次重新編譯.
在dos窗口輸入:
ffplay f:/coacol.mp4
回車. 呵呵, 看看到播放畫面了.
不過, 還有問題, 我們沒有編出ffserver.exe. google一下, 發(fā)現(xiàn)要解決這個(gè)非常困難. 要自己改腳本文件. 好像沒有幾個(gè)人去這樣做. 因此決定放棄. 想在windows自己編譯出ffserver只能用cygwin了.
到此. 整個(gè)編譯過程完畢.