从android官网下载NDK。下载地址:
NDK 下载 | Android NDK | Android Developers (google.cn)
本例android-ndk-r20b下载地址:
https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip?hl=zh-cn
下载后解压到linux环境,如目录:
/home/user/android-ndk-r20b
记得配置执行权限:
- cd /home/user/android-ndk-r20b
- chmod +x ./android-ndk-r20b -R
可以从github下载:https://github.com/FFmpeg/FFmpeg
下载后解压到linux环境,如目录:
- /home/user/ffmpeg20220808
-
- chmod +x ./ffmpeg20220808 -R
新建一个build_android_arm64.sh,内如复制粘贴用于arm64交叉编译脚本。放在目录
/home/user/ffmpeg20220808,记得
chmod+x build_android_arm64.sh
- #!/bin/bash
-
- ############ndk dir ##################
- export NDK=/home/user/android-ndk-r20b
- TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
-
-
- function build_android
- {
-
- ./configure \
- --prefix=$PREFIX \
- --enable-neon \
- --enable-hwaccels \
- --enable-gpl \
- --disable-postproc \
- --disable-debug \
- --enable-small \
- --enable-jni \
- --enable-mediacodec \
- --enable-decoder=h264_mediacodec \
- --enable-static \
- --enable-shared \
- --disable-doc \
- --enable-ffmpeg \
- --disable-ffplay \
- --enable-ffprobe \
- --disable-avdevice \
- --disable-doc \
- --disable-symver \
- --cross-prefix=$CROSS_PREFIX \
- --target-os=android \
- --arch=$ARCH \
- --cpu=$CPU \
- --cc=$CC \
- --cxx=$CXX \
- --enable-cross-compile \
- --sysroot=$SYSROOT \
- --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
- --extra-ldflags="$ADDI_LDFLAGS"
-
- make clean
- make -j16
- make install
-
- echo "====== build android arm64 success ====== "
-
- }
-
- ######################### reserved for armv7-a ########################################
- #ARCH=arm
- #CPU=armv7-a
- #API=29
- #CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
- #CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
- #SYSROOT=$TOOLCHAIN/sysroot
- #CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
- #PREFIX=./out/target/$ARCH
- #OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
-
- #arm64-v8a
- ARCH=arm64
- CPU=armv8-a
- #android 10
- API=29
- CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
- CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
- SYSROOT=$TOOLCHAIN/sysroot
- CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
- PREFIX=./out/target/$ARCH
- OPTIMIZE_CFLAGS="-march=$CPU"
-
- #start build
- build_android
新建一个build_android_arm.sh,内如复制粘贴下面armv7的交叉编译脚本。放在目录
/home/user/ffmpeg20220808,记得
chmod+x build_android_arm.sh
- #!/bin/bash
-
- ###############ndk dir ##################
- export NDK=/home/user/android-ndk-r20b
- TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
-
-
- function build_android
- {
-
- ./configure \
- --prefix=$PREFIX \
- --enable-neon \
- --enable-hwaccels \
- --enable-gpl \
- --disable-postproc \
- --disable-debug \
- --enable-small \
- --enable-jni \
- --enable-mediacodec \
- --enable-decoder=h264_mediacodec \
- --enable-static \
- --enable-shared \
- --disable-doc \
- --enable-ffmpeg \
- --disable-ffplay \
- --enable-ffprobe \
- --disable-avdevice \
- --disable-doc \
- --disable-symver \
- --cross-prefix=$CROSS_PREFIX \
- --target-os=android \
- --arch=$ARCH \
- --cpu=$CPU \
- --cc=$CC \
- --cxx=$CXX \
- --enable-cross-compile \
- --sysroot=$SYSROOT \
- --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
- --extra-ldflags="$ADDI_LDFLAGS"
-
- make clean
- make -j16
- make install
-
- echo "====== build android arm64 success ====== "
-
- }
-
- ######################### reserved for armv7-a ########################################
- ARCH=arm
- CPU=armv7-a
- API=29
- CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
- CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
- SYSROOT=$TOOLCHAIN/sysroot
- CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
- PREFIX=./out/target/$ARCH
- OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
-
-
- #start build
- build_android
注意,以上两个.sh 一定要修改 export NDK=/home/user/android-ndk-r20b到你自己的ndk目录。
另外,如果编译android 11等对应的android版本,可以修改API=30.
在/home/user/ffmpeg20220808目录,运行两个脚本即可交叉编译:
- ./build_android_arm.sh
-
- ./build_android_arm64.sh
有其他配置修改,在函数 function build_android{}里面修改。编译产物在out/文件夹下。ffmpeg与ffprobe可执行文件,在当前目录。
把编译后的与编译脚本.sh同级目录的 ffmpeg 通过adb push 到手机系统中:
- adb remount
- adb push ffmpeg /vendor/bin
- adb push ffprobe /vendor/bin
把编译后的out/target/arm64/lib目录的全部so, 通过adb push 到手机文件系统/vendor/lib64中:
adb push Z:\ffmpeg20220808\out\target\arm64\lib\libavcodec.so Z:\ffmpeg20220808\out\target\arm64\lib\libavformat.so Z:\ffmpeg20220808\out\target\arm64\lib\libavfilter.so Z:\ffmpeg20220808\out\target\arm64\lib\libavutil.so Z:\ffmpeg20220808\out\target\arm64\lib\libpostproc.so Z:\ffmpeg20220808\out\target\arm64\lib\libswscale.so /vendor/lib64
可以在adb shell里面敲命令验证一下:
- adb shell
- ffmpeg -i /sdcard/111.mp4
- ffprobe /sdcard/Dolls.mp4
由于编译动态加载的SO,可能跟项目其他版本的FFmpeg编译的so冲突,则可以修改configure来把so编译到bin一起。
function build_android() 删掉:
--enable-shared \
function build_android() 添加:
- --pkg-config-flags="--static" \
- --disable-shared \