1. 程式人生 > >MAC下將FFmpeg3.3原始碼編譯成so

MAC下將FFmpeg3.3原始碼編譯成so

環境準備:

mac OS

修改ffmpeg-3.3/configure檔案

如果直接按照未修改的配置進行編譯,結果編譯出來的so檔案類似libavcodec.so.55.39.101,版本號位於so之後,Android上似乎無法載入。因此需要按如下修改:

將該檔案中的如下四行:

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可以說是一個包絡音視訊編解碼及格式的超級霸。因此在編譯前通常都需要進行配置,設定相應的環境變數等。

所有的配置選項都在ffmpeg-2.2/configure這個指令碼

檔案中,可以通過執行如下命令來檢視所有的配置選項:

$ ./configure –help

我們將需要的配置項和環境變數設定寫成一個sh指令碼檔案來執行以便編譯出Android平臺需要的so檔案出來。

build_android.sh的內容如下:

#!/bin/bash
#export TMPDIR="/Users/mack/Desktop/tools/ffmpeg-3.3"
NDK=/Users/mack/Desktop/tools/sdk/ndk-bundle
NDK_VERSION=android-21
function build_one {
./configure \
--target-os=linux \
--arch=$ARCH \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--enable-cross-compile \
--cross-prefix=$CROSS_COMPILE \
--sysroot=$SYSROOT \
--extra-cflags="-fpic"
make clean
make
make install
}

ARCH=arm
CPU=arm
PREFIX=$(pwd)/android/$CPU
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
SYSROOT=$NDK/platforms/$NDK_VERSION/arch-$ARCH
build_one



(1)    NDK,SYSROOT和TOOLCHAIN這三個環境變數一定要換成你自己機器裡的。

(2)    確保cross-prefix變數所指向的路徑是存在的。

(3)    這裡踩到一個坑就是下載NDK的時候下了windows或linux的都是不行的,我們是mac環境要下載darwin的NDK,如果你是windows或者linux那麼久下載對應的NDK就行,不同的系統TOOLCHAIN這個路徑中最後的部分是不一樣的

這裡記錄下這個錯誤: C compiler test failed.

執行命令,獲取sh檔案的許可權

  1. chmod +x ./build_android.sh  

執行build_android.sh

  1. ./build_android.sh 

至此,會在/ffmpeg-3.3目錄下生成一個android目錄,其/ffmpeg-3.3/android/arm/lib目錄下的so庫檔案如下


注意:/ffmpeg-3.3/android/include這個目錄下的標頭檔案資訊後面開發需要用到