? ? ? ? 本文的交叉編譯在window上安裝VMware,使用Ubuntu20.4進行的編譯。
一、安裝NDK:
? ? ? ? 1、下載解壓:
????????在NDK 下載 ?|? Android NDK ?|? Android Developers下載Liunx平臺的NDK。
? ? ? ? 本人下載的是android-ndk-r27c-linux.zip版本的。
? ? ? ? 解壓android-ndk-r27c-linux.zip
unzip android-ndk-r27c-linux.zip
? ? ? ? 在存放NDK的目錄下解壓?android-ndk-r27c-linux.zip:
? ? ? ? 2、修改android-ndk-r27c-linux文件權限:? ? ??
sudo chmod 777 -R android-ndk-r27c
? ? ? ? 3、NDK的環境變量的配置:
? ? ? ? 編輯/etc/profile:
sudo vim /etc/profile
? ? ? ? 將NDK存放的路徑加入到環境當中:
? ? ? ? 路徑為NDK存放的路徑,可以cd到NDK文件夾下pwd后獲取:
? ? ? ? 之后配置如下環境變量:?
export PATH=/home/wyy/Android/sdk/platform-tools:$PATH
export PATH=/home/wyy/Android/sdk/tools:$PATH
export ANDROID_NDK=/home/wyy/Android/NDKS/android-ndk-r27c
export PATH=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin
? ? ? ?在/etc/profile文件中配置退出“INSERT”模式后“:wq”保存設置。
? ? ? ? 更新/etc/profile配置:
source /etc/profile
? ? ? ? 驗證NDK版本:
ndk-build --version
? ? ? ?
二、下載解壓FFmpeg:
? ? ? ? 1、下載ffmpeg:
? ? ? ? 通過ffmpeg的下載頁面下載需要的ffmpeg的版本:Download FFmpeg
????????本人下載的是:ffmpeg-5.1.6.tar.xz版本的
? ? ? ? 2、解壓ffmpeg:
? ? ? ? 解壓ffmpeg-5.1.6.tar.xz
tar -xvf ffmpeg-5.1.6.tar.xz
? ? ? ? 3、修改文件權限
sudo chmod 777 -R ffmpeg-5.1.6
三、創建編譯腳本
? ? ? ? ?1、在ffmpeg的文件目錄下運行./configure:
? ? ? ? 會出現的錯誤提示:?
? ? ? ? 如未安裝yasm,則需要安裝yasm:
????????
? ? ? ?2、創建android_build1.sh編譯腳本:
? ? ? ? 在ffmpeg-5.1.6文件夾下創建android_build1.sh:
sudo gedit android_build1.sh
? ? ? ? 輸入如下腳本代碼:
#!/bin/bash
# 用于編譯android平臺的腳本# NDK所在目錄
NDK_PATH=/home/wyy/Android/NDKS/android-ndk-r27c # tag1
# macOS 平臺編譯,其他平臺看一下 $NDK_PATH/toolchains/llvm/prebuilt/ 下的文件夾名稱
HOST_PLATFORM=linux-x86_64 #tag1
# minSdkVersion
API=23TOOLCHAINS="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM"
SYSROOT="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM/sysroot"
# 生成 -fpic 與位置無關的代碼
CFLAG="-D__ANDROID_API__=$API -Os -fPIC -DANDROID "
LDFLAG="-lc -lm -ldl -llog "# 輸出目錄
PREFIX=`pwd`/android
# 日志輸出目錄
CONFIG_LOG_PATH=${PREFIX}/log
# 公共配置
COMMON_OPTIONS=
# 交叉配置
CONFIGURATION=build() {APP_ABI=$1echo "======== > Start build $APP_ABI"case ${APP_ABI} inarmeabi-v7a)ARCH="arm"CPU="armv7-a"MARCH="armv7-a"TARGET=armv7a-linux-androideabiCC="$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-androidCC="$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-androidCC="$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_CFLAGS="$CFLAG -march=$MARCH -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-androidCC="$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_CFLAGS="$CFLAG -march=$CPU -msse4.2 -mpopcnt -m64"EXTRA_LDFLAGS="$LDFLAG"EXTRA_OPTIONS="--cpu=$CPU ";;esacecho "-------- > Start clean workspace"
make cleanecho "-------- > 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"# nm 和 stripCONFIGURATION="$CONFIGURATION --nm=$TOOLCHAINS/bin/llvm-nm"CONFIGURATION="$CONFIGURATION --strip=$TOOLCHAINS/bin/llvm-strip"CONFIGURATION="$CONFIGURATION $EXTRA_OPTIONS"echo "-------- > Start config makefile with $CONFIGURATION --extra-cflags=${EXTRA_CFLAGS} --extra-ldflags=${EXTRA_LDFLAGS}"./configure ${CONFIGURATION} \--extra-cflags="$EXTRA_CFLAGS" \--extra-ldflags="$EXTRA_LDFLAGS"echo "-------- > Start make $APP_ABI with -j1"make -j1echo "-------- > Start install $APP_ABI"make installecho "++++++++ > make and install $APP_ABI complete."}build_all() {#配置開源協議聲明COMMON_OPTIONS="$COMMON_OPTIONS --enable-gpl"#目標android平臺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" # do not build command line programsCOMMON_OPTIONS="$COMMON_OPTIONS --disable-ffmpeg" # disable ffmpeg buildCOMMON_OPTIONS="$COMMON_OPTIONS --disable-ffplay" # disable ffplay buildCOMMON_OPTIONS="$COMMON_OPTIONS --disable-ffprobe" # disable ffprobe buildCOMMON_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-muxer=flv"#COMMON_OPTIONS="$COMMON_OPTIONS --enable-avresample"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"echo "PREFIX=$PREFIX"echo "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_all
echo "-------- End --------"
? ? ? ?
? ? ? ? 3、運行android_build1.sh腳本:
sudo sh android_build1.sh
????????
? ? ? ? 4、編譯完成:
? ? ? ? 經過一段時間的編譯后,在android的文件夾下。編譯完成的結果輸出如下:
? ? ? ??
? ? ? ? include文件夾:
? ? ? ? 包含編譯目標平臺的頭文件信息。
? ? ? ? lib文件夾:
? ? ? ? 包含編譯目標平臺的so庫。
????????
????????log文件夾:
??????包含編譯目標平臺編譯時的log信息。
? ? ? ? pkgconfig文件夾:
????????該文件包含了FFmpeg庫的相關信息,如頭文件路徑、庫文件路徑等。
????????
? ? ? ? share文件夾:
????????包含文檔和手冊,幫助用戶理解和使用FFmpeg。
????????以上的資源文件可在下面連接可下載:https://download.csdn.net/download/wangyongyao1989/91214032?spm=1001.2014.3001.5503