概述
FFmpeg是一套非常強大的音視訊處理工具,在音視訊領域絕對是一個元老級的存在,圍繞FFmpeh可以進行音視訊編解碼,裁剪,拼接等操作。 今天的主題就是使用NDK進行教交叉編譯,生成so檔案在Android上使用
我的編譯環境:
- FFmpeg v3.0.11 (之前測試最新版3.3.4編譯失敗)
- macOS
- NDK android-ndk-r14b
- Android Studio 3.1
下載FFmpeg原始碼
FFmpeg官網下載:www.ffmpeg.org/download.ht…
也可以Git下載 git clone git.ffmpeg.org/ffmpeg.git ffmpeg
配置指令碼
預設編譯出來的so庫版本號是在.so之後,Android識別不了,所以要修改configure檔案
使用sublime開啟configure,大概在3305行
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)'
複製程式碼
配置build_android.sh
這個檔案需要自己在FFmpeg根目錄下手動建立,直接在sublime新建一個.sh檔案。此指令碼網上很多,大部分可以直接拿過來使用,但是要注意修改NDK目錄。下面我提供一個修改之後的指令碼以供參考
# ndk環境
export NDK=/Users/CH/Learn/android-ndk-r14b
export SYSROOT=$NDK/platforms/android-14/arch-arm
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CPU=armv7-a
# 要儲存動態庫的目錄,這裡儲存在原始碼根目錄下的android/armv7-a
export PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
function build_android
{
./configure
--target-os=linux
--prefix=$PREFIX \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--enable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
# 不確定自己上面的目錄或者環境有沒有錯誤時
# 可以先註釋一下下面兩個命令
# make
# make install
}
build_android
複製程式碼
執行指令碼
進入到指令碼根目錄,如果你是第一次執行可能會提示許可權不足,如下:
Permission denied
授予許可權即可:
chmod 777 build_android.sh
複製程式碼
然後重新執行
./build_android.sh
複製程式碼
此處如果指令碼檔案環境配置正常會提示一個WARNING,不用管它繼續執行
make
複製程式碼
大概15分鐘之後執行結束根目錄下你配置的輸出目錄下看到.so檔案和標頭檔案兩個資料夾,如下圖:
提示
儘量先執行./build_android 確認配置無問題在執行 make 和 makeinstall 因為編譯一次大概十幾分鍾。所以說一定先確認環境,目錄無問題在執行 make
問題
1 .在執行./build_android.sh 時報錯如下
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build
那就說明你沒有安裝彙編工具yasm
直接在終端執行
brew install yasm
複製程式碼
即可安裝
2.在輸出目錄時報錯大概如下
No such file or directory make: Error 127
這說明你的輸出目錄找不到,儘量不要把輸出目錄建在系統下。還有一點最好手動把輸出目錄設定為可讀寫(雖然可能已經是可讀寫了~)
3.新版本FFpmeg編譯失敗
目前在我編譯過程中最新版本3.4.2是不行的,我目前使用的是3.0.11
4.最好不要使用androidstudio下載的ndk
到官網手動 下載ndk(我使用的是android-ndk-r14b)
developer.android.google.cn/ndk/downloa…
總結
編譯過程中一定要耐心再耐心~特別像我這種不會C不會Linux的,簡直是在看天書各種google,下一篇會講述把so包整合到Android中。