在網(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ù)中的make
和make 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)之處請多多指教。