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檔案的許可權
- chmod +x ./build_android.sh
執行build_android.sh
- ./build_android.sh
至此,會在/ffmpeg-3.3目錄下生成一個android目錄,其/ffmpeg-3.3/android/arm/lib目錄下的so庫檔案如下
注意:/ffmpeg-3.3/android/include這個目錄下的標頭檔案資訊後面開發需要用到