Mac中編譯FFmpeg教程(Android版)
本篇文章主要介紹在Mac環境中,編譯FFmpeg生成so庫。
FFmpeg簡介
FFmpeg既是一款音視訊編解碼工具,同時也是一組音視訊編解碼開發套件,作為編解碼開發套件,它為開發者提供了豐富的音視訊處理的呼叫介面。 FFmpeg提供了多種媒體格式的封裝和解封裝,包括多種音視訊編碼、多種協議的流媒體、多種色彩格式轉換、多種取樣率轉換、多種位元速率轉換等。FFmpeg框架提供了多種豐富的外掛模組,包含封裝與解封裝的外掛、編碼與解碼的外掛等。
開發環境
本次編譯的環境如下:
- macOS High Sierra(10.13.5)
- FFmpeg原始碼(3.3.7)
- ndk(android-ndk-r14b)
首先下載ndk,建議不要使用Android Studio自帶的ndk-bundle,然後配置ndk的全域性環境,在.bash_profile中新增一下配置:
export ANDROID_NDK_ROOT=/Users/jiangshuaijie/android-ndk-r14b/build
export PATH=${PATH}:${ANDROID_NDK_ROOT}
複製程式碼
然後在命令列中輸入ndk-build測試環境是否配置成功。
下載FFmpeg原始碼
FFmpeg的原始碼可以在 https://ffmpeg.org/download.html#releases 中下載,也可以使用git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg 克隆到本地。建議下載3.3.x版本的庫,最新的庫編譯的問題比較多,各種路徑不正常等問題。
修改configure檔案
下載FFmpeg原始碼之後,首先需要對原始碼中的configure檔案進行修改。由於編譯出來的動態庫檔名的版本號在.so之後(例如“libavcodec.so.5.100.1”),而android平臺不能識別這樣檔名,所以需要修改這種檔名。在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)'
複製程式碼
編寫指令碼生成類庫
在ffmpeg中建立一個build_android.sh的指令碼,並賦予可執行的許可權,指令碼內容如下:
#!/bin/bash
make clean
# NDK的路徑,根據自己的安裝位置進行設定
export TMPDIR=/Users/jiangshuaijie/ffmpeg-3.3.7/ffmpeg_install
export NDK=/Users/jiangshuaijie/android-ndk-r14b
export SYSROOT=$NDK/platforms/android-21/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
function build_one
{
./configure \
--prefix=$PREFIX \
--target-os=linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--enable-shared \
--enable-runtime-cpudetect \
--enable-gpl \
--enable-small \
--enable-cross-compile \
--disable-debug \
--disable-static \
--disable-doc \
--disable-asm \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--enable-postproc \
--enable-avdevice \
--disable-symver \
--disable-stripping \
$ADDITIONAL_CONFIGURE_FLAG
sed -i '' 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h
sed -i '' 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h
sed -i '' 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h
sed -i '' 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h
sed -i '' 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i '' 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
sed -i '' 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h
sed -i '' 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h
make clean
# 這裡是定義用幾個CPU編譯,我用4個,一般在5分鐘之內編譯完成
make -j4
make install
}
build_one
複製程式碼
其中:
- TMPDIR為編譯生成的臨時檔案存放的目錄
- SYSROOT為so檔案支援的最低Android版本的平臺目錄
- CPU為指定so檔案支援的平臺
- PREFIX為生成的so檔案存放目錄
- TOOLCHAIN為編譯所使用的工具鏈目錄
- cross-prefix為編譯所使用的工具鏈檔案
- enable和disable指定了需要編譯的項
- target-os為目標作業系統;
編譯FFmpeg
在ffmpeg目錄中,執行終端命令:
./build_android.sh
複製程式碼
即可編譯,然後等待生成so檔案即可。