我自己的FFMpeg編譯之路


為了編譯這個東西,快折騰了一個星期了。期間經歷了很多痛苦的過程,今天我把整個過程,以及在這個過程的感悟寫下來,以備日后查看,也希望能幫到一些像我一樣的兄弟姐妹。

 

在這一個星期里前前后后加起來總共使用了3中方式編譯ffmpeg

1. 在基於linux內核的操作系統中編譯。這種方式很簡單,也很順利。

2. 在windows下, 采用cygwin編譯,這種方法稍微復雜一點。

3. 在windows下,采用MinGW + MSys編譯,這種方法是這三個方法中最為復雜的一種。涉及的東西也最多,花費的時間也最長。

 

下面就這個三種方法詳細介紹一二。

我所選用ffmpeg source code 的版本是0.6,可以以下連接獲取。

 http://www.ffmpeg.org/releases/ffmpeg-0.6.tar.gz

 

基於linux內核的操作系統中編譯:

我所用的操作系統是ubuntu, 將下載ffmpeg的源碼放在/home目錄下面。或者你也可以用svn從服務器上checkout ffmpeg的代碼。ubuntu默認情況下是沒有安裝svn,但是你可以通過一個非常的簡單的命令就完成安裝,命令是sudo apt-get subversion。前提是你可以訪問因特網。這個過程大約需要幾分鍾,具體的時間跟你的網絡狀況有關系。

 

打開終端,進入ffmpeg目錄。依次輸入以下命令:

./configure --enable-memalign-hack --disable-debug

make

 

你也可以將2條命令合成一條,一次性執行完成。

./configure --enable-memalign-hack --disable-debug && make

 

當命令完成之后你就可以在ffmpeg的目錄下找到8個可執行程序:

ffmpeg.exe

ffmpeg_g.exe

ffprobe.exe

ffprobe_g.exe

ffplay.exe

ffplay_g.exe

ffserver.exe

ffserver_g.exe

每個可執行程序有一個_g的相對應。這個帶調試信息的可執行程序。

這樣編譯任務完成。

 

似乎很順利, 接下來我們輕松一下,用我們編譯出來的成果來看個電影,敲入如下命令:

./ffplay /media/downdriver/hly.mp4

 

然而我們被告知:

Could not initialize SDL library: No avaiable video device

 

這是怎么回事呢? 原來我的系統中沒有安裝x11的庫文件, 因此編譯出來的SDL庫就沒有加載視頻設備的能力了。那接下來我們首先下載對應x11的庫文件,然后重新編譯SDL, 那么有沒有必要重新編譯ffmpeg呢, 沒有必要。

 

下載庫文件:

sudo apt-get install libx11-dev

 

下載必要的頭文件:

sudo apt-get install xorg-dev

 

安裝成功后,再次進入sdl源代碼目錄重新編譯, 不要忘了首先執行:

make clean

 

接着是:

./configure

make && make install

 

再來一次:

./ffplay /media/downdriver/hly.mp4

 

呵呵,成功了,看到我們的視頻了...

 

 

通過windows + Cygwin編譯:

首先安裝Cygwin, 通過以下連接獲取:

http://www.cygwin.com/setup.exe

 

這種方式的安裝過程,最復雜,和最耗時的就在安裝Cygwin上了。setup.exe下載非常簡單也很快,都不到1M. 但是這只是下載了安裝的包的客戶端。接下來的安裝是通過setup.exe從官方網站下載安裝包。速度會很慢,並且根據你所選的包種類,大小不一樣。如果全部選中那么你將要下載的總大小在六七百M以上。也許你覺得不大,但是當我告訴你速度下載的速度很慢時,並且經常會出現下載到半截就死活不動了。(至少在中國很慢,不光是我有這種感受,在網上看到很多人都有這個問題,甚至有位網友為了解決這個網速慢和下載不動的情況,自己研究一套方案)。並且如果全選安裝后會吃掉你兩三個G的空間。我們只是編譯ffmpeg,所以沒有必要全選,只選devel這個就可以了(忘了說怎么進行安裝,由於安裝向導做的不錯,所以你只要按照向導說的一步一步往下走ok  ,我這里只說其中關鍵的步驟)。另外在選mirror site的時候請選ftp://mirrors.kernel.org(如果你在中國這個網站可能會快一些)。為了下載我試過里面幾乎所有的網站,當然如果你選用我推薦的這個網站,速度仍然很慢,你可以選用美國的那些鏡像。也許你會問我怎么知道那個是美國的鏡像,問得好,打開www.cygwin.com這個網站,這是cygwin的官方網站。在主頁的右面請點擊mirror site,那么現在你可以看到那些是美國的了。

 

好了,讓我們繼續。

假設你現在已經安裝完成了cygwin的安裝。打開cygwin的命令窗口, 進入ffmpeg 的目錄,cygwin進入windows的方式為

cd /cygdrvie/[盤符]/...

例如進入d:\test\ffmpage,那么命令就是:

cd /cygdrive/d/test/ffmpeg

 

進入目錄后,鍵入 ./configure --enable-memalign-hack --disable-debug 然后回車

等待幾分鍾后,看到執行成功,祝賀你。接下來我們要執行的命令是make.

但是當你輸入make后發現,提示你make不認識。好,去 cygwin的bin目錄看看有沒有這個make.exe存在, 結果不存在,那我們去找個一個最新的make.

這里有2個方法來解決這個問題,

1. 重新啟動cygwin的setup, 在安裝組件選擇界面中, 在最上方的文本框中輸入make, 下面就會相應的顯示包,然后選擇安裝這個包,繼續完  成安裝.

2. 在網絡上找一個最新的make, 要求版本是3.81. 然后直接拷貝到 /cygwin/bin目錄.

好,現在再一次執行命令make, 你會看到CC xxx, CC xxx之類的東西.說明已經用gcc開始編譯了.

如果沒有什么編譯錯誤, 你可以在命令行的最后幾行看到ffmpeg.exe, ffserver.exe, ffprobe.exe

這說明成功了.

 

但是你會發現你沒有看到ffplay.exe

那是因為要編譯ffplay必須依賴於sdl庫,這同樣是一個opensource 的東西, 對應的官網是http://www.libsdl.org. 這個庫負責一些輸入設備的事件以及界面的事情. 若想了解更多,請參看官網.

 

接下來我們要做的是下載對應的源代碼,編譯,安裝.

首先下載源代碼:

http://www.libsdl.org/release/SDL-1.2.14.tar.gz

下載完畢后拷貝到 /cygwin/home/下面.然后cygwin的窗口中進入home目錄, 接着輸入tar -szvf sdl-1.2.14.tar.gz  這個命令是用來解壓我們剛才下載的文件的. 解壓完畢后, cd sdl-1.2.14進入sdl的源代碼目錄. 執行sh autogen.sh, 大約一分鍾后, 你會看到 you are ready to run confingure. 這個表示剛才那條命令執行成功了. 並且告訴你下一條命令是configure. 好接下來我們輸入./configure命令.

這個需要幾分鍾的時間. 我在執行這條命令時出錯,

***Your compiler (gcc) does not produce Win32 executables

google了一下, 找到一個解決辦法:

是在一個老外的網站看到的, 他是這樣寫的

$ chmod 755 /usr/bin/set-gcc-default-3.sh $ /usr/bin/set-gcc-default-3.sh

但是當輸入第一條命令后, 錯了, 說找不到set-gcc-default-3.sh. 我們去對應目錄找找, 果然沒有. 並且usr目錄下竟然沒有bin這個目錄. 我猜是不是在/cygwin/bin下面, 果然在那里找到了. 從這個可以看到開源代碼一個很大的問題, 版本很穩定. 變化很大. 也許我的這個編譯文檔過幾個月可能就不能用了.好了回到主題.

當編譯完畢后需要將gcc的版本切換回來, 切換回4的命令如下:

$ chmod 755 /usr/bin/set-gcc-default-4.sh $ /usr/bin/set-gcc-default-4.sh

這個命令是的作用是將gcc的版本轉換為3, 當前版本是4. 因為sdl要求的環境是3的.

接下來就是

make

make install

 

如果上面的命令執行都沒有錯誤的話, 接下來我們要做的就是重來編譯我們的ffmpeg, 就是進入ffmpeg的目錄,執行

./configure --enable-memalign-hack --disable-debug

make

這里有個小技巧, 可以幫助我們在不執行make命令的情況下, 判斷執行make命令后我們能不能得到ffplay. 畢竟make需要超過10分鍾的時間. 就是在configure命令執行完畢后查看結果的最初20行左右, 找到sdl support, 如果它的右邊寫的是yes, 那就說明我們可以得到ffplay,如果是no, 那就得不到ffplay.

我的結果是yes, 接下來執行make, 還是有錯誤, __assert 沒有定義之類的錯誤.有人說把對應的libavformat等文件下 .a文件刪除.然后用

./configure --enable-memalign-hack --disable-debug --enable-shared --disable-static

如果要編譯出ffserver,還需要加上--enable-network --enable-protocols --enable-muxers

到這里在cygwin下面的編譯就通過了.

 

順便解釋一下,如果你要編譯出動態庫,就要加上

--enable-shared

--enable-static

 

另外, --enable-memalign-hack是指編譯時,使用內存對齊方式,這樣以便編譯時用mmx或者sse指令對代碼進行優化。

 

make install

在這種編譯方式下是把編譯出來的文件拷貝到C:\cygwin\usr\local\bin目錄,要看你的cygwin安裝到什么地方,我的安裝在c盤,所以是C:\cygwin\。如果是后面的一種編譯方式,則是將編譯出來的文件拷貝到msys的安裝目錄,如我的是安裝到c盤,就是c:\msys\local\bin

 

ffmpeg編譯時,還可以根據你cpu 核心的個數,進行編譯時間的優化,也就是說當你指定你的cpu為雙核時,比你不指定編譯要快。例如指定2核心時:

make -j2

 

 通過windows + MinGW + MSYS編譯

這種編譯方式最為復雜, 也是花去我時間最多的一種.

首先去MinGW的官網下載安裝包.

官網是 www.mingw.org

安裝包的連接:

http://cdnetworks-kr-1.dl.sourceforge.net/project/mingw/Automated%20MinGW%20Installer/MinGW%205.1.6/MinGW-5.1.6.exe

如果不可用去

http://sourceforge.net/projects/mingw/

下載.

MSYS的下載地址:

http://downloads.sourceforge.net/mingw/MSYS-1.0.10.exe

接下來就是安裝mingw和msys.安裝順序一定要是先安裝mingw再安裝msys.因為在安裝msys的過程中要你指定mingw的安裝目錄.

mingw的安裝沒有什么可說的, 就是采用默認安裝, 不要更改它的默認目錄, c:/mingw. 接下來安裝msys.

msys安裝過程中會問你是否已經安裝了mingw, 敲入y然后回車

接着讓你輸入mingw的安裝目錄, 輸入c:/mingw, 注意是反斜扛.

這樣我們環境似乎准備好了(之所以這么說, 是因為我們在后面編譯的過程中會發現很多問題). 那么開始我們的編譯之旅吧.

在開始菜單中依次找到mingw->msys->msys.打開shell環境.

同樣需要進入ffmpeg目錄. 有些人直接把ffmpeg拷貝到mingw的home目錄, 這樣進入ffmpeg目錄很簡單. 只要在打開shell窗口后,輸入cd ffmpeg-0.6(這里ffmpeg-0.6是我放置ffmpeg的目錄). 就可以編譯了. 我是放在D盤. 因為本人不喜歡在系統盤下放太多的東西. 為了進入本人的ffmpeg目錄需要這樣:

cd /d

cd downloadcode

cd ffmpeg-0.6

這里 /d 代表進入d盤, 接着downloadcode文件夾, 再進入ffmpeg-0.6

從這里可以看出在cygwin的shell下面和msys的shell下面還是有點不一樣.

 

好了, 我們執行

./configure --enable-memalign-hack --disable-debug

沒有出錯

接着輸入

make

告訴我make不認識, 看來遇到的是和windows+cygwin下面同樣的問題, 用同樣的方法解決.

成功的執行完make后, 回到我們的ffmpeg文件下面看看, 編譯出來哪些東西.

發現只有ffprobe.exe ffmpeg.exe

沒有ffplay.exe, ffserver.exe

google后發現, 有個老外碰到同樣的問題, 並給出了解決辦法. 從sdl的官網下載已經編譯好的dll,連接如下:

http://www.libsdl.org/release/SDL-devel-1.2.14-mingw32.tar.gz

然后解壓, 將其中的bin, lib, include 3個文件夾拷貝到mingw的目錄下, 當詢問是否覆蓋, 選擇是.

到bin目錄找到sdl-config.用ultraedit打開. 將PREFIX=后面的值改為c:/mingw

 

接下來, 編譯, 成功獲得ffplay.exe.

打開windows命令窗口(cmd.exe). 經入ffmpeg目錄, 執行ffplay.exe, 發現崩潰了, 提示gcc的版本太舊, 我暈, 真是有點太繁瑣了, 從網站下載最新的gcc集合. 連接如下:

http://cdnetworks-kr-1.dl.sourceforge.net/project/tdm-gcc/TDM-GCC%20Installer/tdm-gcc-4.5.0.exe

安裝后在c盤下找到mingw32文件夾, 這就是我們剛才安裝gcc, 進入目錄將bin, inlude, lib 3個文件夾拷貝到mingw的目錄下, 當詢問是否覆蓋, 選擇是.

 

再一次重新編譯.

在dos窗口輸入:

ffplay f:/coacol.mp4

回車. 呵呵, 看看到播放畫面了.

 

不過, 還有問題, 我們沒有編出ffserver.exe. google一下, 發現要解決這個非常困難. 要自己改腳本文件. 好像沒有幾個人去這樣做. 因此決定放棄. 想在windows自己編譯出ffserver只能用cygwin了.

 

有些附加庫可以直接用cygwin下載,方法如下:

 http://ffmpeg.org/platform.html#Compilation-under-Cygwin

http://sourceware.org/cygwinports/

到此. 整個編譯過程完畢.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM