前言
前面已经讲了在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)/build
mkdir x265/build/android
cp -rf build_script/* x265/build/android
export 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
#popd
pushd 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=1
sed -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.txt
make -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 zlib
function 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-ar
cd 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=26
cd FFmpeg
function 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-config
make 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/lib
echo $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/lib
echo $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/lib
echo $ZLIB_INCLUDE
echo $ZLIB_LIB
export 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 测试下章