Mac下交叉編譯FFmpeg3.4.5出Android的so包

在網(wǎng)上找了很多資料都從未編譯成功過骤坐,一度特別失望纽绍;終于看了夏曹俊老師的視頻播放器開發(fā)課之后也經(jīng)過幾番周折势似,最后成功了,在此總結(jié)一下履因,希望對在尋找資料的人有所幫助。

準(zhǔn)備工作

這里兩大主角就是:

  • FFmpeg(版本是3.4.5)
  • NDK(版本android-ndk-r15c)

特別注意這里版本是關(guān)鍵栅迄,下錯了估計(jì)不行

我最開始下載了ffmpeg4.1不行,4.0.3還是不行西篓,最后使用了3.4.5終于可以了;當(dāng)然這里ndk我事先查資料知道了ndk16以后刪除了一些東西污淋,必須用15以及以下的才可以余掖。

下載方式有很多,這里是官方的FFmpeg3.4.5文件盐欺,進(jìn)入界面點(diǎn)擊snapshot就能下載了,是一個.tar.gz文件冗美,下載下來之后解壓到某個目錄即可,這個在哪都沒有關(guān)系节预。

然后就是下載DNK,這個也是在官網(wǎng)下載就行安拟,mac版ndk-r15c宵喂,下載好也是解壓好就可以了,放哪也沒有關(guān)系,但是最好放在一起拙泽。

我是建了一個ffmpeg目錄,在目錄下把ndk和ffmpeg-3.4.5放在一起的顾瞻。

下載好之后,就可以執(zhí)行命令了王浴,并不需要修改configure文件,因?yàn)閺?.4開始編譯成android動態(tài)鏈接庫的名稱就是對的了氓辣。

編譯過程

一般編譯都有三部:

  • 執(zhí)行configure文件
  • 執(zhí)行make命令編譯
  • 執(zhí)行make install命令打包

但是我們在執(zhí)行configure文件的時(shí)候一般都會加一些參數(shù),這就是本文的重點(diǎn)钞啸,我整理成了編譯腳本喇潘,配置了armv7-a和x86的。

首先創(chuàng)建一個build_android.sh的腳本文件颖低,名字隨意,然后將下邊的腳本復(fù)制過去修改ndk的路徑即可忱屑。

使用方法

將build_android.sh腳本放到ffmpeg3.4.5目錄下,然后執(zhí)行chmod +x build_android.sh命令給腳本增加權(quán)限伴嗡,再直接執(zhí)行./build_android.sh即可。

當(dāng)然最好先看完我下邊的講解再執(zhí)行也不晚瘪校,下邊有腳本的解釋名段。當(dāng)然你也可以把腳本中NDK路徑修改之后,再把make和make install命令注釋掉之后運(yùn)行這個腳本也是可以的伸辟。如果出錯了再看看下邊的解釋,看看配置是否有問題。

腳本如下:

#!/bin/bash
echo "進(jìn)入編譯ffmpeg腳本"
NDK=/Users/arvin/develop/ffmpeg/ndk/android-ndk-r15c

function buildFF
{
    echo "開始編譯ffmpeg"

    ARM=$1
    DST=$2
    ABI_PREFIX=$3
    PLATFORM=$NDK/platforms/android-21/arch-$ARM
    TOOLCHAIN=$NDK/toolchains/$DST-4.9/prebuilt/darwin-x86_64

    echo "ABI_PREFIX = ${ABI_PREFIX}"
    echo "PLATFORM = ${PLATFORM}"
    echo "TOOLCHAIN = ${TOOLCHAIN}"

    ./configure \
    --prefix=$PREFIX \
    --target-os=android \
    --cross-prefix=$TOOLCHAIN/bin/$ABI_PREFIX- \
    --arch=$ARM \
    --sysroot=$PLATFORM \
    --extra-cflags="$CFLAG" \
    --cc=$TOOLCHAIN/bin/$ABI_PREFIX-gcc \
    --nm=$TOOLCHAIN/bin/$ABI_PREFIX-nm \
    --enable-shared \
    --enable-runtime-cpudetect \
    --enable-gpl \
    --enable-small \
    --enable-cross-compile \
    --disable-debug \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-postproc \
    --disable-avdevice \
    --disable-symver \
    --disable-stripping \
    $ADD 
    make -j16
    make install
    echo "編譯結(jié)束!"
}
###########################################################
echo "編譯armv7-a支持neon和硬解碼"
CPU=armv7-a
PREFIX=./android/$CPU-neon-hard
CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp "
ADD="--cpu=$CPU \
    --enable-asm \
    --enable-neon \
    --enable-jni \
    --enable-mediacodec \
    --enable-decoder=h264_mediacodec \
    --enable-hwaccel=h264_mediacodec "
buildFF arm arm-linux-androideabi arm-linux-androideabi

###########################################################
# echo "編譯x86支持neon和硬解碼"
# PREFIX=./android/x86-neon-hard
# CFLAG=""
# ADD="--extra-libs=-lgcc \
#     --disable-asm \
#     --enable-neon \
#     --enable-jni \
#     --enable-mediacodec \
#     --enable-decoder=h264_mediacodec \
#     --enable-hwaccel=h264_mediacodec "
# buildFF x86 x86 i686-linux-android

腳本解釋

其中命令有一些比較重要的下邊依次介紹脐彩。

  • #!/bin/bash這個注釋表示這是一個bash腳本
  • echo是用來打印變量姊扔,方便調(diào)試的
  • NDK=你的ndk路徑,這種方式是命名變量并賦值
  • function是定義函數(shù)恰梢,這里定義了一個buildFF函數(shù),方便調(diào)用嵌言,后邊可以加參數(shù),在方法中通過$+數(shù)字獲取绵载,第一個參數(shù)就是$1,以此類推
  • PLATFORM是編譯的架構(gòu)娃豹,armv7-a就是arm架構(gòu)购裙,可以看到在ndk/platforms/android-某個版本目錄下有很多arch-各種架構(gòu)的文件
  • TOOLCHAINS是交叉編譯的工具,選擇的目錄表示在哪個系統(tǒng)下編譯成哪個系統(tǒng)架構(gòu)躏率,以編譯成armv7-a架構(gòu)為例,就表示在mac系統(tǒng)下編譯成arm-linux-androideabi-49私股。其實(shí)自己也可以去ndk/toolchains目錄下看一下,就大概明白了
  • 下邊介紹configure的參數(shù)倡鲸,--prefix表示make install成功之后輸出文件的路徑
  • --target-os這里我們編譯成android黄娘,很多文章寫成linux,可能是在3.2以前可以吧逼争,現(xiàn)在需要寫成android,不然可能會有些頭文件找不到
  • --cross-prefix就是交叉編譯工具的前綴胆敞,可以去那個目錄下,你就能看到為什么這樣寫了
  • --arch這個就是編譯成什么架構(gòu)移层,這里有兩種armv7-a(參數(shù)需要寫成arm)和x86的
  • --sysroot這個就是platform的路徑,表示在這個平臺下的庫文件為基礎(chǔ)
  • --extra-cflags是給gcc編譯時(shí)增加的指令观话,在編譯armv7-a架構(gòu)的時(shí)候加上那些參數(shù)才能成功,其中-mfpu是指讓gcc知道要使用neon協(xié)處理器频蛔,而在x86的編譯時(shí),這些指令都不能加晦溪,可能是x86架構(gòu)下gcc對這些指令不支持,所以要去掉才能成功
  • --cc--nm就是指定gcc和nm的位置
  • 然后就是一系列--enable指令和--disable指令利凑,就不一一介紹了
  • make -j16是開啟16個線程去執(zhí)行編譯,這樣會快很多

其中在執(zhí)行腳本之前哀澈,大家可以先把腳本函數(shù)中的makemake install注釋掉度气,因?yàn)榫幾g過程也會花不少時(shí)間,注釋掉之后執(zhí)行磷籍,就只需要看配置是否有問題。沒有error之后再解開注釋執(zhí)行院领。

注意在每次執(zhí)行了腳本之后最好執(zhí)行一下make clean清理一下。

對于armv7-a和x86的編譯cflag和ADD的內(nèi)容不一樣丈氓,cflag在上文中說了强法,ADD部分,前者需要添加cpu類型饮怯,后者不需要,但是需要加上--extra-libs=-lgcc--disable-asm指令:

  • --extra-libs=-lgcc是為了讓x86架構(gòu)下gcc執(zhí)行編譯不報(bào)錯
  • --disable-asm是為了讓x86架構(gòu)在as中使用的時(shí)候不會出現(xiàn)text relocation錯誤库倘,意思是禁止匯編

到這里基本就講述完成了临扮,說起來內(nèi)容不多公条,但是在不了解的情況下,出了錯真的一點(diǎn)辦法都沒有迂曲。希望本文對還沒有編譯成功的人有幫助路捧。

我也是剛接觸這一塊传黄,若有不當(dāng)之處請多多指教。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末章姓,一起剝皮案震驚了整個濱河市仇冯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌擦盾,老刑警劉巖系忙,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件银还,死亡現(xiàn)場離奇詭異,居然都是意外死亡洁墙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門捺弦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狼纬,“玉大人,你說我怎么就攤上這事疗琉。” “怎么了凑耻?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵太示,是天一觀的道長类缤。 經(jīng)常有香客問我邻吭,道長,這世上最難降的妖魔是什么囱晴? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮畸写,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘论笔。我一直安慰自己,他們只是感情好狂魔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布真慢。 她就那樣靜靜地躺著,像睡著了一般管嬉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朗鸠,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天烛占,我揣著相機(jī)與錄音,去河邊找鬼忆家。 笑死,一個胖子當(dāng)著我的面吹牛芽卿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卸例,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肌毅,長吁一口氣:“原來是場噩夢啊……” “哼悬而!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笨奠,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤唤殴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體左电,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年篓足,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片连舍。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涩哟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贴彼,到底是詐尸還是另有隱情,我是刑警寧澤器仗,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站威鹿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏轨香。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一檀夹、第九天 我趴在偏房一處隱蔽的房頂上張望筋粗。 院中可真熱鬧炸渡,春花似錦、人聲如沸蚌堵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至躲舌,卻和暖如春性雄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秒旋。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迁筛,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓尉桩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親魄健。 傳聞我的和親對象是個殘疾皇子插勤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容