編譯環境是win10,ndk r14,ffmpeg3.0
1. 下載下傳工具包
首先自然是下載下傳NDK及FFmpeg并解壓,Windows下編譯需要下載下傳MinGW
下載下傳完畢後MinGW需要安裝,安裝好之後是個下載下傳管理器,選擇安裝選項的時候要選上mingw-developer-toolkit,mingw32-gcc-ada,msys-base三項。

MinGW.png
2.編輯FFmpeg目錄裡的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)'
這是為了修改檔案名格式
3. 建立build_android.sh檔案作為編譯腳本
#!/bin/bash
# NDK的路徑,根據實際安裝位置設定
NDK=D:/java/androidstudio/sdk/ndk-bundle
# 編譯針對的平台,這裡選擇最低支援android-14, arm架構,生成的so庫是放在libs/armeabi檔案夾下的,若針對x86架構,要選擇arch-x86
PLATFORM=$NDK/platforms/android-14/arch-arm
# 工具鍊的路徑,arm-linux-androideabi-4.9與上面設定的PLATFORM對應,4.9為工具的版本号
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$PLATFORM \
--extra-cflags="-I$PLATFORM/usr/include" \
make clean
make -j4
make install
}
# arm v7vfp
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=
build_one
# CPU=armv
# PREFIX=$(pwd)/android/$CPU
# ADDI_CFLAGS="-marm"
# build_one
#arm v6
#CPU=armv6
#OPTIMIZE_CFLAGS="-marm -march=$CPU"
#PREFIX=./android/$CPU
#ADDITIONAL_CONFIGURE_FLAG=
#build_one
#arm v7vfpv3
# CPU=armv7-a
# OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
# PREFIX=./android/$CPU
# ADDITIONAL_CONFIGURE_FLAG=
# build_one
#arm v7n
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
#PREFIX=./android/$CPU
#ADDITIONAL_CONFIGURE_FLAG=--enable-neon
#build_one
#arm v6+vfp
#CPU=armv6
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
#PREFIX=./android/${CPU}_vfp
#ADDITIONAL_CONFIGURE_FLAG=
#build_one
}
# arm v7vfp
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
PREFIX=./android/$CPU-vfp
ADDITIONAL_CONFIGURE_FLAG=
build_one
# CPU=armv
# PREFIX=$(pwd)/android/$CPU
# ADDI_CFLAGS="-marm"
# build_one
#arm v6
#CPU=armv6
#OPTIMIZE_CFLAGS="-marm -march=$CPU"
#PREFIX=./android/$CPU
#ADDITIONAL_CONFIGURE_FLAG=
#build_one
#arm v7vfpv3
# CPU=armv7-a
# OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
# PREFIX=./android/$CPU
# ADDITIONAL_CONFIGURE_FLAG=
# build_one
#arm v7n
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
#PREFIX=./android/$CPU
#ADDITIONAL_CONFIGURE_FLAG=--enable-neon
#build_one
#arm v6+vfp
#CPU=armv6
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
#PREFIX=./android/${CPU}_vfp
#ADDITIONAL_CONFIGURE_FLAG=
#build_one
其中要注意TMPDIR、NDK、TOOLCHAIN、--cross-prefix對應實際目錄位址,可别漏了。
./configure部分根據自己的需要調整功能。全要的話庫檔案未免太大。
--disable-avdevice \ 這一行控制了不輸出libavdevice.so檔案,即最後的輸出目錄中不存在這個.so檔案
--enable-shared 這一行啟動動态編譯
--disable-static 這一行禁用靜态編譯
4.編譯
運作C:\MinGW\msys\1.0目錄下的msys.bat,cd到ffmpeg目錄執行build_android.sh
./build_android.sh
5. 結果
等待十幾分鐘之後,控制台輸出如下結果:
結果.png
6. 檔案
在ffmpeg-3.3.6檔案夾下生成一個android目錄,目錄下對應的是不同的架構,這裡隻生成了armv7-a這個目錄,include中是頭檔案,lib中是生成.so檔案,用的時候使用檔案名貴上帶數字的.so檔案。
檔案.png
詳情.png