編譯最新版FFmpeg for Android NDK(r21)

這里介紹在Mac下使用最新版NDK(r21)編譯最新版的FFmpeg(4.3.1),在NDK r17之后棄用了gcc键思,改用clang進行編譯础爬,因此最新版本NDK主要解決用clang配置編譯ffmpeg。原地址

準備

FFmpeg文件目錄

修改編譯配置

默認配置是編譯生成Linux環(huán)境下的庫吼鳞,需要修改為生成Android環(huán)境下的so

用文本編輯器(比如Sublime text)打開ffmpeg文件夾下的configure文件看蚜,找到以下配置進行替換:

# 注釋掉默認configure 文件中的配置:
# SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
# LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
# SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
# SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

# 替換為:
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='?(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

創(chuàng)建編譯腳本

  • 打開終端,cd到ffmpeg目錄下赔桌,執(zhí)行以下命令創(chuàng)建腳本文件:
touch build_android.sh
  • 用vim打開文件:
vim build_android.sh
  • 復(fù)制以下shell腳本到 build_android.sh:
    (注意:NDK需要修改成自己的路徑)
#!/bin/bash
# 以下路徑需要修改成自己的NDK目錄
TOOLCHAIN=/Users/xxx/Library/Android/sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/darwin-x86_64/
# 最低支持的android sdk版本
API=29

function build_android
{
# 打印
echo "Compiling FFmpeg for $CPU"
# 調(diào)用同級目錄下的configure文件
./configure \
# 指定輸出目錄
    --prefix=$PREFIX \
# 各種配置項供炎,想詳細了解的可以打開configure文件找到Help options:查看
    --disable-neon \
    --disable-hwaccels \
    --disable-gpl \
    --disable-postproc \
    --enable-shared \
    --enable-jni \
    --disable-mediacodec \
    --disable-decoder=h264_mediacodec \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-avdevice \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$CROSS_PREFIX \
    --target-os=android \
    --arch=$ARCH \
    --cpu=$CPU \
    --cc=$CC
    --cxx=$CXX
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}

#armv8-a
ARCH=arm64
CPU=armv8-a
# r21版本的ndk中所有的編譯器都在/ndk/21.3.6528147/toolchains/llvm/prebuilt/darwin-x86_64/目錄下(clang)
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
# NDK頭文件環(huán)境
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
# so輸出路徑
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android

# 交叉編譯工具目錄,對應(yīng)關(guān)系如下
# armv8a -> arm64 -> aarch64-linux-android-
# armv7a -> arm -> arm-linux-androideabi-
# x86 -> x86 -> i686-linux-android-
# x86_64 -> x86_64 -> x86_64-linux-android-

# CPU架構(gòu)
#armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android

#x86
ARCH=x86
CPU=x86
CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
build_android

#x86_64
ARCH=x86_64
CPU=x86-64
CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
# 方法調(diào)用
build_android
  • 輸入:wq保存

開始編譯

  • 先給腳本添加權(quán)限:
chmod 777 ./build_android.sh
  • 然后就可以運行腳本編譯了:
./build_android.sh

編譯完成

編譯完成

編譯完成后將輸出文件

so輸出

常見問題

  • x86版本編譯問題
    如果編譯完后發(fā)現(xiàn)沒有輸出x86 so,檢查是否有輸出以下錯誤信息:
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.

原因是編譯x86依賴匯編器nasm或者yasm沒有安裝疾党。
因此需要先安裝好匯編器音诫,這里我們選擇其一進行安裝
安裝方法:brew install yasm(通過homebrew 進行安裝)
安裝成功再重新編譯即可。

  • Android 加載x86 so問題
    在運行時加載so報錯:
java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/xxx.xxx.xxx-1/lib/x86/libavcodec.so: has text relocations

原因是android 6.0之后雪位,系統(tǒng)做了限制竭钝。Android 6.0 changes

On previous versions of Android, if your app requested the system to load a shared library with text relocations, the system displayed a warning but still allowed the library to be loaded. Beginning in this release, the system rejects this library if your app's target SDK version is 23 or higher. To help you detect if a library failed to load, your app should log the dlopen(3) failure, and include the problem description text that the dlerror(3) call returns. To learn more about handling text relocations, see this guide.

解決方法:需要在編譯選項中增加參數(shù)--disable-asm

增加參數(shù)

如果出現(xiàn)以下錯誤

dlopen failed: cannot locate symbol "iconv_open",”iconv_close“

只能降低API版本,修改build_android.sh:API=26

[參考]
[1] https://yesimroy.gitbooks.io/android-note/content/compile_ffmpeg_for_android.html
[2] https://stackoverflow.com/questions/57681336/build-ffmpeg-4-2-with-android-ndk-r20
[3] http://www.reibang.com/p/feab970fd74c
[4] https://juejin.im/post/6844903945496690696
[5] https://blog.csdn.net/marco_0631/article/details/73292199
[6] http://www.reibang.com/p/fd938a51b01f
[7] https://github.com/tianshaokai/ffmpegbuild

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末香罐,一起剝皮案震驚了整個濱河市卧波,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庇茫,老刑警劉巖港粱,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旦签,居然都是意外死亡查坪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門顷霹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咪惠,“玉大人,你說我怎么就攤上這事淋淀∫C粒” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵朵纷,是天一觀的道長炭臭。 經(jīng)常有香客問我,道長袍辞,這世上最難降的妖魔是什么鞋仍? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮搅吁,結(jié)果婚禮上威创,老公的妹妹穿的比我還像新娘。我一直安慰自己谎懦,他們只是感情好肚豺,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著界拦,像睡著了一般吸申。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上享甸,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天截碴,我揣著相機與錄音,去河邊找鬼蛉威。 笑死日丹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚯嫌。 我是一名探鬼主播聚凹,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼割坠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妒牙?” 一聲冷哼從身側(cè)響起彼哼,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎湘今,沒想到半個月后敢朱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡摩瞎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年拴签,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旗们。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蚓哩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出上渴,到底是詐尸還是另有隱情岸梨,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布稠氮,位于F島的核電站曹阔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏隔披。R本人自食惡果不足惜赃份,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奢米。 院中可真熱鬧抓韩,春花似錦、人聲如沸鬓长。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痢士。三九已至彪薛,卻和暖如春茂装,著一層夾襖步出監(jiān)牢的瞬間怠蹂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工少态, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留城侧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓彼妻,卻偏偏與公主長得像嫌佑,于是被迫代替她去往敵國和親豆茫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354