交叉編譯-Mac環境使用NDK編譯FFmpeg

ICH發表於2018-09-10

概述

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檔案和標頭檔案兩個資料夾,如下圖:

交叉編譯-Mac環境使用NDK編譯FFmpeg

提示

儘量先執行./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中。

相關文章