- NDK編譯環境建置
- 下載FFmpeg Source最新版本
- 編譯FFmpeg
1. NDK編譯環境建置
至https://developer.android.com/ndk/downloads?hl=de下載最新版本的NDK
此文章使用版本為:android-ndk-r21e
此文章路徑放置:/Users/xxx/android_ndk/android-ndk-r21e
此文章當時使用的MacOS版本:11.5.2
2. 下載FFmpeg Source最新版本
下載FFmpeg Source最新版本,如以下指令
打開終端機
cd ~/
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg_source_v1
此文章下載的FFmpeg version 4.4
3. 編譯FFmpeg
編譯FFmpeg
a. cd ~/ffmpeg_source_v1
b. ./configure
完成後會出現License版本(此文章編譯License -> LGPL 2.1)
c. 將下方文字儲存成build_android.sh
./build_android.sh
NDK_PATH=/Users/xxx/android_ndk/android-ndk-r21e HOST_PLATFORM=darwin-x86_64 API=29 TOOLCHAINS="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM" SYSROOT="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM/sysroot" CFLAG="-D__ANDROID_API__=$API -Os -fPIC -DANDROID " LDFLAG="-lc -lm -ldl -llog " PREFIX=android-build CONFIG_LOG_PATH=${PREFIX}/log COMMON_OPTIONS= CONFIGURATION= build() { APP_ABI=$1 echo "----> Start build $APP_ABI" case ${APP_ABI} in armeabi-v7a) ARCH="arm" CPU="armv7-a" MARCH="armv7-a" TARGET=armv7a-linux-androideabi CC="$TOOLCHAINS/bin/$TARGET$API-clang" CXX="$TOOLCHAINS/bin/$TARGET$API-clang++" LD="$TOOLCHAINS/bin/$TARGET$API-clang" CROSS_PREFIX="$TOOLCHAINS/bin/arm-linux-androideabi-" EXTRA_CFLAGS="$CFLAG -mfloat-abi=softfp -mfpu=vfp -marm -march=$MARCH " EXTRA_LDFLAGS="$LDFLAG" EXTRA_OPTIONS="--enable-neon --cpu=$CPU " ;; arm64-v8a) ARCH="aarch64" TARGET=$ARCH-linux-android CC="$TOOLCHAINS/bin/$TARGET$API-clang" CXX="$TOOLCHAINS/bin/$TARGET$API-clang++" LD="$TOOLCHAINS/bin/$TARGET$API-clang" CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-" EXTRA_CFLAGS="$CFLAG" EXTRA_LDFLAGS="$LDFLAG" EXTRA_OPTIONS="" ;; x86) ARCH="x86" CPU="i686" MARCH="i686" TARGET=i686-linux-android CC="$TOOLCHAINS/bin/$TARGET$API-clang" CXX="$TOOLCHAINS/bin/$TARGET$API-clang++" LD="$TOOLCHAINS/bin/$TARGET$API-clang" CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-" EXTRA_CFLAGS="$CFLAG -march=$MARCH -mtune=intel -mssse3 -mfpmath=sse -m32" EXTRA_LDFLAGS="$LDFLAG" EXTRA_OPTIONS="--cpu=$CPU " ;; x86_64) ARCH="x86_64" CPU="x86-64" MARCH="x86_64" TARGET=$ARCH-linux-android CC="$TOOLCHAINS/bin/$TARGET$API-clang" CXX="$TOOLCHAINS/bin/$TARGET$API-clang++" LD="$TOOLCHAINS/bin/$TARGET$API-clang" CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-" EXTRA_CFLAGS="$CFLAG -march=$CPU -mtune=intel -msse4.2 -mpopcnt -m64" EXTRA_LDFLAGS="$LDFLAG" EXTRA_OPTIONS="--cpu=$CPU " ;; esac echo "----> Start make clean" make clean echo "----> Start build configuration" CONFIGURATION="$COMMON_OPTIONS" CONFIGURATION="$CONFIGURATION --logfile=$CONFIG_LOG_PATH/config_$APP_ABI.log" CONFIGURATION="$CONFIGURATION --prefix=$PREFIX" CONFIGURATION="$CONFIGURATION --libdir=$PREFIX/libs/$APP_ABI" CONFIGURATION="$CONFIGURATION --incdir=$PREFIX/includes/$APP_ABI" CONFIGURATION="$CONFIGURATION --pkgconfigdir=$PREFIX/pkgconfig/$APP_ABI" CONFIGURATION="$CONFIGURATION --cross-prefix=$CROSS_PREFIX" CONFIGURATION="$CONFIGURATION --arch=$ARCH" CONFIGURATION="$CONFIGURATION --sysroot=$SYSROOT" CONFIGURATION="$CONFIGURATION --cc=$CC" CONFIGURATION="$CONFIGURATION --cxx=$CXX" CONFIGURATION="$CONFIGURATION --ld=$LD" CONFIGURATION="$CONFIGURATION $EXTRA_OPTIONS" echo "----> Start config makefile with $CONFIGURATION --extra-cflags=${EXTRA_CFLAGS}" echo "--extra-ldflags=${EXTRA_LDFLAGS}" ./configure ${CONFIGURATION} --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" echo "----> Start make $APP_ABI" make -j10 echo "----> Start make install $APP_ABI" make install echo "----> complete." } build_all() { #下方可自行定義,./configure -h可以查看選項內容 COMMON_OPTIONS="$COMMON_OPTIONS --target-os=android" COMMON_OPTIONS="$COMMON_OPTIONS --disable-static" COMMON_OPTIONS="$COMMON_OPTIONS --enable-shared" COMMON_OPTIONS="$COMMON_OPTIONS --enable-protocols" COMMON_OPTIONS="$COMMON_OPTIONS --enable-cross-compile" COMMON_OPTIONS="$COMMON_OPTIONS --enable-optimizations" COMMON_OPTIONS="$COMMON_OPTIONS --disable-debug" COMMON_OPTIONS="$COMMON_OPTIONS --enable-small" COMMON_OPTIONS="$COMMON_OPTIONS --disable-doc" COMMON_OPTIONS="$COMMON_OPTIONS --disable-programs" COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffmpeg" COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffplay" COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffprobe" COMMON_OPTIONS="$COMMON_OPTIONS --disable-symver" COMMON_OPTIONS="$COMMON_OPTIONS --disable-network" COMMON_OPTIONS="$COMMON_OPTIONS --disable-x86asm" COMMON_OPTIONS="$COMMON_OPTIONS --disable-asm" COMMON_OPTIONS="$COMMON_OPTIONS --enable-pthreads" COMMON_OPTIONS="$COMMON_OPTIONS --enable-mediacodec" COMMON_OPTIONS="$COMMON_OPTIONS --enable-jni" COMMON_OPTIONS="$COMMON_OPTIONS --enable-zlib" COMMON_OPTIONS="$COMMON_OPTIONS --enable-pic" COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=h264" COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mpeg4" COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mjpeg" COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=png" COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=vorbis" COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=opus" COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=flac" echo "COMMON_OPTIONS=$COMMON_OPTIONS, PREFIX=$PREFIX, CONFIG_LOG_PATH=$CONFIG_LOG_PATH" mkdir -p ${CONFIG_LOG_PATH} #編譯成四個平台 build "armeabi-v7a" build "arm64-v8a" build "x86" build "x86_64" } echo "Start build" build_all echo "End build"
d. 編譯完成後,在build_android下會生成如此圖
備註:編譯過程中出現,無法打開「arm-linux-androideabi-ranlib」,因為無法驗證開發者。
1. 按打開,如果沒有打開選項,按取消後,就必須至安全性與隱私權->一般->強制允許
2. 只要有按取消,就必須至終端機control+c取消編譯,重頭來,直到沒按取消為止
否則會編譯失敗,因為android-ndk-r21e是網路上下載的
訂閱Codeilin的旅程,若有最新消息會通知。
廣告
發表迴響