前言
前面已經講了在windows上應用了,這章主要講述android上編譯
1:環境
git 如果失敗 直接跑到相應網站 手動下載
ubuntu22.*
android ndk r21e download:https://developer.android.google.cn/ndk/downloads/index.html?hl=uk
為什么用這個,用過最新的28的,不是編譯子so有問題 就是最后編譯 ffmpeg 時有問題,花太多時間不劃算
libx264 git clone https://code.videolan.org/videolan/x264.git or 手動 master (沒找到版本號)
(https://code.videolan.org/videolan/x264/-/tree/master?ref_type=heads 右上角代碼里下載要下的類型 一般zip就可以了)
libx265 git clone https://bitbucket.org/multicoreware/x265_git.git or 手動 3.3 (https://bitbucket.org/multicoreware/x265_git/downloads/)
這里先說明下,4.1可以編過,但是 合到ffpmeg 里 有問題沒解決(弄了大半天,耗不起),先用3.3代替了,有空再研究下
fdk-aac git clone https://github.com/mstorsjo/fdk-aac.git or 手動 2.0.3
(https://github.com/mstorsjo/fdk-aac/tags)
zlib https://zlib.net/zlib131.zip
ffpmeg download
cmake 3.22.* 自動安裝
編譯 x265 4.1的 需要安裝 GUI 版本的 sudo apt install cmake-curses-gui 不然ccmake 跳出配置項 需要修改環境的
autoconf 也裝下 其他automake libtool 自行決定 這里是一塊裝了 sudo apt-get install autoconf automake libtool
**2:編譯 **
先看下結果吧, 過程太折騰了
臨時把虛擬機 core 調高點,不然 編譯太慢了,也可以在windows下用 msys2 編譯
這里編譯的全是 26 版,其他版本自行修改,ndk r21e 最高只能到30
腳本 參考網上其他人的 再修改的
#!/bin/bash
export NDK=/home/ubuntu22/ffpmeg/android-ndk-r21e # 這里需要替換成你本地的 NDK 路徑,其他的不用修改
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export API=26
cd x264
function build_android
{
./configure \--prefix=$PREFIX \--disable-cli \--enable-shared \--enable-static \--enable-pic \--host=$my_host \--cross-prefix=$CROSS_PREFIX \--sysroot=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot \make clean
make -j4
make install
}#arm64-v8a
PREFIX=/home/ubuntu22/ffpmeg/android/x264/arm64-v8a
my_host=aarch64-linux-android
export TARGET=aarch64-linux-android
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
build_android
2>x265 3.3版的
rm -rf $(pwd)/x265/build/android
rm -rf $(pwd)/buildmkdir x265/build/android
cp -rf build_script/* x265/build/androidexport NDK_ROOT=/home/ubuntu22/ffpmeg/android-ndk-r21e # 換成自己的實際 NDK 路徑 android-ndk-r21e
export ANDROID_API_VERSION=26
export NUMBER_OF_CORES=2
export OUTPUT_PREFIX=/home/ubuntu22/ffpmeg/android/x265
#aarch64-linux-android26#export CC="$TOOLCHAIN/bin/${TARGET}${API_LEVEL}-clang"
#export CXX="$TOOLCHAIN/bin/${TARGET}${API_LEVEL}-clang++"#pushd x265/build/android/armeabi-v7a
#bash build.sh
#popdpushd x265/build/android/arm64-v8a
bash build.sh
popd
build_script/arm64-v8a/build.sh
#set(CMAKE_C_COMPILER,$CC)
#set(CMAKE_C_COMPILER,$CXX)export CMAKE_C_COMPILER=aarch64-unknown-linux-gnu-gcc
export CMAKE_CXX_COMPILER=aarch64-unknown-linux-gnu-g++cmake ../../../source \-DCMAKE_SYSTEM_NAME=Android \-DCMAKE_SYSTEM_VERSION=${ANDROID_API_VERSION} \-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \-DCMAKE_ANDROID_NDK=${NDK_ROOT} \-DCMAKE_ANDROID_STL_TYPE=c++_static \-DNEON_ANDROID=1sed -i 's/-lpthread/-pthread/g' CMakeFiles/cli.dir/link.txt
sed -i 's/-lpthread/-pthread/g' CMakeFiles/x265-shared.dir/link.txt
sed -i 's/-lpthread/-pthread/g' CMakeFiles/x265-static.dir/link.txtmake -j${NUMBER_OF_CORES}
#make DESTDIR=${OUTPUT_PREFIX}/arm64-v8a install
make DESTDIR=${OUTPUT_PREFIX}/arm64-v8a install
#make PREFIX=${OUTPUT_PREFIX}/arm64-v8a install
3> zlib
#!/bin/bash
export NDK=/home/ubuntu22/ffpmeg/android-ndk-r21e # 這里需要替換成你本地的 NDK 路徑,其他的不用修改
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export API=26
#"armeabi-v7a arm64-v8a x86_64 x86"
#ARCHS="arm64-v8a"
#ARCHS="armeabi-v7a arm64-v8a x86_64 x86"
#configure [--const] [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]# [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]# [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]cd zlibfunction build_android
{
./configure \--prefix=$PREFIX \--64 \--archs="-arch arm"make clean
make -j2
make install
}#arm64-v8a
PREFIX=/home/ubuntu22/ffpmeg/android/zlib/arm64-v8a
my_host=aarch64-linux-android
export TARGET=aarch64-linux-android
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
build_android
4>aac
#!/bin/bash# ndk目錄
export NDK=/home/ubuntu22/ffpmeg/android-ndk-r21e # 這里需要替換成你本地的 NDK 路徑,其他的不用修改
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export TARGET=aarch64-linux-android# 架構
#archs="armeabi-v7a arm64-v8a x86 x86_64"
# api等級
export API=26
# --- 輸入參數指定 End ---PREFIX=/home/ubuntu22/ffpmeg/android/aac/arm64-v8a
my_host=aarch64-linux-android
export TARGET=aarch64-linux-android
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-#export AS=$TOOLCHAIN/bin/$TARGET$API-as
export AS=$TOOLCHAIN/bin/$TARGET-as
export LD=$TOOLCHAIN/bin/$TARGET-ld
export NM=$TOOLCHAIN/bin/$TARGET-nm
export STRIP=$TOOLCHAIN/bin/$TARGET-strip
export RANLIB=$TOOLCHAIN/bin/$TARGET-ranlib
export AR=$TOOLCHAIN/bin/$TARGET-arcd aac./autogen.sh
# config
#CXXFLAGS="-std=c++11 -DDEBUG=1"
#CFLAGS="-std=c11"
#${log-lib}
#LDFLAGS="${LDFLAGS} -llog"
#LIBS="${LIBS}"
#LT_SYS_LIBRARY_PATH= "aarch64-linux-android"
#export LDFLAGS="${LDFLAGS} -L$TOOLCHAIN/sysroot/usr/lib/aarch64-linux-android/26"#export LDFLAGS="-L/home/ubuntu22/ffpmeg/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/26"
#export LIBS="${LIBS} -llog"
#/home/ubuntu22/ffpmeg/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/26/liblog.so
#echo $LDFLAGS./configure \
--host=$my_host \
--enable-shared \
--enable-static \
--target=android \
--disable-frontend \
--enable-static \
--prefix=$PREFIX \
--sysroot=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot # make
make clean
make -j2
make install
5> ffmpeg
#!/bin/bash
export NDK=/home/ubuntu22/ffpmeg/android-ndk-r21e # 這里需要替換成你本地的 NDK 路徑,其他的不用修改
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
#export API=26cd FFmpegfunction build_android
{
#echo "The start of FFmpeg with x264,fdk-aac for $CPU is completed"
echo "The start of FFmpeg "./configure \
--prefix=$PREFIX \
--enable-neon \
--enable-hwaccels \
--enable-gpl \
--disable-postproc \
--enable-static \
--enable-shared \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--enable-libx264 \
--enable-libx265 \
--enable-libfdk-aac \
--enable-encoder=libx264 \
--enable-encoder=libx265 \
--enable-encoder=libfdk-aac \
--enable-nonfree \
--enable-muxers \
--enable-decoders \
--enable-demuxers \
--enable-parsers \
--enable-protocols \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$X264_INCLUDE -I$X265_INCLUDE -I$FDK_INCLUDE -I$ZLIB_LIB -I$SYSROOT/usr/include -Os -fpic $OPTIMIZE_CFLAGS $OTHER_CFLAGS" \
--extra-ldflags="-lm -L$FDK_LIB -L$X264_LIB -L$X265_LIB -L$ZLIB_LIB -L$SYSROOT/usr/lib " \
--target-os=android \
--disable-large-tests \
--pkg-config=/usr/bin/pkg-configmake clean
make -j2
make install
#echo "The Compilation of FFmpeg with x264,fdk-aac for $CPU is completed"
echo "########################################"
echo $OPTIMIZE_CFLAGS
echo $ADDI_LDFLAGS
#$ADDI_LDFLAGS
pkg-config --libs x265
echo "########################################"
}
#--disable-avdevice \#--extra-cflags="$(pkg-config --cflags glib-2.0)" \# --extra-ldflags="$(pkg-config --libs glib-2.0)"#--pkg-config=/usr/local/bin/pkg-config \
#armv8-a
ARCH=arm64
CPU=armv8-a
API=26
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=/home/ubuntu22/ffpmeg/android/ffpmeg/arm64-v8a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
OTHER_CFLAGS="-fno-rtti -fno-exceptions"#BASE_PATH=/root/workspace
BASE_PATH=/home/ubuntu22/ffpmeg/android
LIB_TARGET_ABI=arm64-v8a#指定 fdk-aac 的頭文件和靜態庫目錄
###PREFIX= /home/ubuntu22/ffpmeg/android/acc/arm64-v8a
FDK_INCLUDE=$BASE_PATH/aac/$LIB_TARGET_ABI/include
FDK_LIB=$BASE_PATH/aac/$LIB_TARGET_ABI/lib
echo $FDK_INCLUDE
echo $FDK_LIB#指定 x264 的頭文件和靜態庫目錄
#PREFIX=/home/ubuntu22/ffpmeg/android/x264/arm64-v8a
X264_INCLUDE=$BASE_PATH/x264/$LIB_TARGET_ABI/include
X264_LIB=$BASE_PATH/x264/$LIB_TARGET_ABI/libecho $X264_INCLUDE
echo $X264_LIB#指定 x264 的頭文件和靜態庫目錄
#/home/ubuntu22/ffpmeg/android/x265/arm64-v8a
X265_ROOT=/home/ubuntu22/ffpmeg/android/x265/arm64-v8a/usr/local
X265_INCLUDE=$X265_ROOT/include
X265_LIB=$X265_ROOT/lib#X265_INCLUDE=$BASE_PATH/x265/$LIB_TARGET_ABI/include
#X265_LIB=$BASE_PATH/x265/$LIB_TARGET_ABI/libecho $X265_INCLUDE
echo $X265_LIB#指定 zlib 的頭文件和靜態庫目錄
#PREFIX=/home/ubuntu22/ffpmeg/android/zlib/arm64-v8a
ZLIB_INCLUDE=$BASE_PATH/zlib/$LIB_TARGET_ABI/include
ZLIB_LIB=$BASE_PATH/zlib/$LIB_TARGET_ABI/libecho $ZLIB_INCLUDE
echo $ZLIB_LIBexport PKG_CONFIG_PATH=$X265_LIB/pkgconfig:$X264_LIB/pkgconfig:$FDK_LIB/pkgconfig:$PKG_CONFIG_PATH
#export PKG_CONFIG_PATH=/home/ubuntu22/ffpmeg/android/x265/arm64-v8a/lib/pkgconfig:$PKG_CONFIG_PATH
#export PKG_CONFIG_PATH=/home/ubuntu22/ffpmeg/android/x265/arm64-v8a/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
#pkg-config --libs x264
#export PKG_CONFIG_PATH=/path/to/custom/pkgconfig:$PKG_CONFIG_PATH 會將 /path/to/custom/pkgconfig 目錄添加到 pkg-config 的搜索路徑中
echo "###############################"
echo $X265_LIB/pkgconfig
pkg-config --libs x265 #pkg-config --list-all|grep x265
echo "###############################"build_android
#../FFmpegn4/configure --arch=x86_64 --target-os=mingw64 --prefix=/d/code/ffpmep/ffmpegLib2 --enable-shared --disable-static --enable-gpl --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-nonfree --enable-zlib --enable-bzlib --disable-postproc
#--extra-ldflags="-lm -L$FDK_LIB -L$X264_LIB $ADDI_LDFLAGS" # -lm 即是鏈接數學庫
#因為 FFmpeg 鏈接的 fdk-aac 需要用到數學庫,不鏈接的話會報如下錯誤:
#cp $FDK_LIB/libfdk-aac.a $PREFIX/lib
#cp $X264_LIB/libx264.a $PREFIX/lib
3: 拷貝子庫到 ffmpeg lib 下
部分需要去掉 so.版號 變為 so 網上 自行搜索 這里直接跳過
把so 及 include 打包好
番外x265 4.1版本 照這個來吧 ccmake 會跳出框的
PREFIX ASSEMBLY CLI 這三個修改下,其他這里也沒修改
修改后 按 c 再按e 再按g
acc 編譯有錯需要改下
寫這里吧 這里純粹偷懶
4:如果對你又幫助,麻煩點個贊,加個關注
寫個android 測試下章