經過這篇文章瞭解c/c++編譯器的基本使用,可以在後續移植第三方框架進行交叉編譯時(編譯android可用的庫),清楚的瞭解應該傳遞什麼參數,怎麼傳遞參數給編譯器,各個參數的意義是什麼,從而爲後面音視頻的深刻學習編譯ffmpeg作好準備工做。android
有關ffmpeg的編譯資料網上一大推,可是照着資料拷貝的運行進行編譯能順利編譯出靜態庫或靜態庫產物的寥寥無幾。c++
筆者在學習的時候也是踩了不少的坑,確實是每次編譯會誕生一個放棄的念頭,緣由仍是本身的基礎學得不夠紮實。面試
由於ffmpeg和NDK都是在不斷進行迭代的,好比說NDK在r18以後以後完全移除了gcc(包含r18版本),ffmpeg在4.o版本開始也針對Android平臺的交叉編譯默認使用clang編譯,可是網上的不少資料都是使用gcc編譯的。shell
因此若是要對照網上資料進行編譯的話,保證NDK版本和ffmpeg版本甚至是編譯環境工具都和做者的同樣,這樣會大大提升編譯的成功率。小程序
在編譯成功以後再不斷嘗試修改參數結合搜索資料嘗試,力求弄清楚每一個參數的意義,作到舉一反三。框架
本次編譯使用的是mac蘋果電腦,使用的NDK版本是r20,ffmpeg是從官網下載的最新版4.2.2。工具
從ffmpeg官網下載好源碼解壓後,進入源碼目錄,新建shell腳本文件,好比學習
腳本內容以下:ui
保存後運行腳本。spa
運行腳本的時候可能會遇到沒有權限的問題,運行命令行增長一下執行權限後再次執行便可進行編譯。
若是沒有報錯,大概幾分鐘後就能看編譯成功:
編譯成功
編譯成功後在目標輸出目錄下會生成三個文件,如圖:
編譯成功後的目錄
其中目錄下是使用動態庫或靜態庫時所須要的一些頭文件;
目錄存放着編譯產物動態庫或者靜態庫;
目錄則存放一些簡單的demo,咱們能夠參照這些demo編寫音視頻的編解碼等邏輯。
更多參數可在ffmpeg的源碼目錄下執行查看。
CFLAG參數這麼長,怎麼來的?其實這個不用死記,能夠從AS NDK工程的.externativeBuild/cmake/debug/armeabi-v7a/build.ninja中拷貝,須要注意的是替換掉NDK的路徑地址。
與網上gcc編譯的腳本對比能夠發現少了一些相似這樣的參數,或許這就是clang的好處之一吧。