本篇文章主要介紹在Mac環境中,編譯FFmpeg生成so庫。html
FFmpeg既是一款音視頻編解碼工具,同時也是一組音視頻編解碼開發套件,做爲編解碼開發套件,它爲開發者提供了豐富的音視頻處理的調用接口。
FFmpeg提供了多種媒體格式的封裝和解封裝,包括多種音視頻編碼、多種協議的流媒體、多種色彩格式轉換、多種採樣率轉換、多種碼率轉換等。FFmpeg框架提供了多種豐富的插件模塊,包含封裝與解封裝的插件、編碼與解碼的插件等。linux
本次編譯的環境以下:android
首先下載ndk,建議不要使用Android Studio自帶的ndk-bundle,而後配置ndk的全局環境,在.bash_profile中添加一下配置:git
export ANDROID_NDK_ROOT=/Users/jiangshuaijie/android-ndk-r14b/build export PATH=${PATH}:${ANDROID_NDK_ROOT}
而後在命令行中輸入ndk-build測試環境是否配置成功。shell
FFmpeg的源碼能夠在 https://ffmpeg.org/download.h... 中下載,也能夠使用git clone https://git.ffmpeg.org/ffmpeg... ffmpeg 克隆到本地。建議下載3.3.x版本的庫,最新的庫編譯的問題比較多,各類路徑不正常等問題。bash
下載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)'
替換成ide
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
其中:post
在ffmpeg目錄中,執行終端命令:
./build_android.sh
便可編譯,而後等待生成so文件便可。