NDK交叉编译FFmpeg安卓编译ffmpeg
NDK交叉编译FFmpeg安卓编译ffmpeg
文章目录
- NDK交叉编译FFmpeg安卓编译ffmpeg
- 编译环境
- 编译工具下载
- 编译过程
- 编译环境
- 系统环境
- NDK版本的选择
- 源码下载
- 只编译简单的ffmpeg
- 编译
- 编译脚本
- 问题
- 使用
- 技术支持
编译环境
编译工具下载
参考这个:https://blog.csdn.net/gaoliang0/article/details/81913291
或者官网 NDK编译工具下载: https://developer.android.google.cn/ndk/downloads?hl=zh-cn
官网老版本: https://github.com/android/ndk/wiki/Unsupported-Downloads
或者从我的百度网盘:
链接:https://pan.baidu.com/s/1FEtM6mVNgER_DvC2myHB5Q?pwd=28l9
提取码:28l9
–来自百度网盘超级会员V6的分享
准备下载 android-ndk-r19c-linux-x86_64.zip 因为这个版本比较适中
编译过程
编译环境
系统环境
系统环境:
iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ uname -a
Linux iyfangfeng 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
NDK版本:
/home/iyfangfeng/libsrc/tools/android-ndk-r19c
以下只编译armeabi-v7a版本如果需要编译其他版本 可以参考 build_fdkaac_all.sh 方式
NDK版本的选择
当前Google给的NDK工具支持GCC最高版本android-ndk-r17c-linux-x86_64.zip之后的版本不再支持gcc,只支持clang来编译,而使用gcc或者clang编译在编译脚本上存在差别,所以需要注意着点。
选择哪个版本取决于使用的编译脚本。
下面的ffmpeg因为涉及到很多第三方库所以会存在同时使用r17c以上的版本或者r17c下的版本 使用gcc编译。
注意:
如果遇到一些奇怪的问题可以换一换NDK版本时候,有时候就解决了,或者更多的使用自己经常使用的版本,比如我用的多是android-ndk-r10e环境来适应gcc编译环境,问题少很多。
-
本地NDK编译器目录参考
iyfangfeng@iyfangfeng:~/libsrc/tools$ ls android-ndk-r10e android-ndk-r10e-linux-x86_64.zip android-ndk-r16b android-ndk-r16b-linux-x86_64.zip android-ndk-r19c android-ndk-r19c-linux-x86_64.zip iyfangfeng@iyfangfeng:~/libsrc/tools$
源码下载
ffmpeg-3.3.8.tar.gz
-
ffmpeg 下载
https://gitee.com/mirrors/ffmpeg/tags?page=4
http://ffmpeg.org/download.html#releases
只编译简单的ffmpeg
编译
iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ ./build_ffmpeg.sh armeabi-v7a
iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ ls libs/lib-ffmpeg/armeabi-v7a/lib/
libavcodec.so libavdevice.so libavfilter.so libavformat.so libavutil.so libpostproc.so libswresample.so libswscale.so pkgconfig
./build_ffmpeg.sh 使用的是gcc 编译脚本
编译脚本
-
最简单的目录结构
iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ ls build_ffmpeg.sh config.sh libs ffmpeg-3.3.8
-
build_ffmpeg.sh
iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ cat build_ffmpeg.sh
#!/bin/bash
ARCH=$1
source config.sh $ARCH
LIBS_DIR=$(cd `dirname $0`; pwd)/libs/lib-ffmpeg
echo "LIBS_DIR="$LIBS_DIR
cd ffmpeg-3.3.8
PLATFORM=$ANDROID_NDK_ROOT/platforms/$AOSP_API/$AOSP_ARCH
TOOLCHAIN=$ANDROID_NDK_ROOT/toolchains/$TOOLCHAIN_BASE-$AOSP_TOOLCHAIN_SUFFIX/prebuilt/linux-x86_64
PREFIX=$LIBS_DIR/$AOSP_ABI
echo ===============================
echo $PREFIX
./configure \
--prefix=$PREFIX \
--enable-cross-compile \
--disable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--target-os=android \
--cc=$TOOLCHAIN/bin/$TOOLNAME_BASE-gcc \
--cross-prefix=$TOOLCHAIN/bin/$TOOLNAME_BASE- \
--disable-stripping \
--nm=$TOOLCHAIN/bin/$TOOLNAME_BASE-nm \
--sysroot=$PLATFORM \
--enable-gpl \
--enable-shared \
--disable-static \
--enable-small \
--enable-postproc \
--enable-avdevice \
--disable-outdevs \
--disable-ffprobe \
--disable-ffplay \
--disable-ffmpeg \
--disable-ffserver \
--disable-debug \
--disable-ffprobe \
--disable-ffplay \
--disable-ffmpeg \
--disable-symver \
--disable-stripping \
--extra-cflags="$FF_EXTRA_CFLAGS $FF_CFLAGS" \
--extra-ldflags=" "
make clean
make -j8
make install
cd ..
-
config.sh
iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ cat config.sh #NDK路径 #clang ffmpeg #export ANDROID_NDK_ROOT=/home/yanglong/iyangfeng/tools/android-ndk-r19c #上面是之前电脑编译路径 #export ANDROID_NDK_ROOT=/home/iyfangfeng/libsrc/tools/android-ndk-r19c #clang #CXX gcc r17c 及其以下 #fdkaac x264 export ANDROID_NDK_ROOT=/home/iyfangfeng/libsrc/tools/android-ndk-r10e export AOSP_TOOLCHAIN_SUFFIX=4.9 export AOSP_API="android-21" #架构 if [ "$#" -lt 1 ]; then THE_ARCH=armv7 else THE_ARCH=$(tr [A-Z] [a-z] <<< "$1") fi #根据不同架构配置环境变量 case "$THE_ARCH" in arm|armv5|armv6|armv7|armeabi) TOOLCHAIN_BASE="arm-linux-androideabi" TOOLNAME_BASE="arm-linux-androideabi" AOSP_ABI="armeabi" AOSP_ARCH="arch-arm" HOST="arm-linux-androideabi" AOSP_FLAGS="-march=armv5te -mtune=xscale -mthumb -msoft-float -funwind-tables -fexceptions -frtti" FF_EXTRA_CFLAGS="-O3 -fpic -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 -mfloat-abi=softfp -mfpu=vfp -marm -march=armv6 " FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID " ;; armv7a|armeabi-v7a) TOOLCHAIN_BASE="arm-linux-androideabi" TOOLNAME_BASE="arm-linux-androideabi" AOSP_ABI="armeabi-v7a" AOSP_ARCH="arch-arm" HOST="arm-linux-androideabi" AOSP_FLAGS="-march=armv7-a -mthumb -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -funwind-tables -fexceptions -frtti " FF_EXTRA_CFLAGS="-DANDROID -fPIE -pipe -fPIC -ffunction-sections -funwind-tables -fstack-protector -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fomit-frame-pointer -fstrict-aliasing" FF_CFLAGS="-O3 -Wall -fPIE -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wa,--noexecstack -DANDROID " ;; hard|armv7a-hard|armeabi-v7a-hard) TOOLCHAIN_BASE="arm-linux-androideabi" TOOLNAME_BASE="arm-linux-androideabi" AOSP_ABI="armeabi-v7a" AOSP_ARCH="arch-arm" HOST="arm-linux-androideabi" AOSP_FLAGS="-mhard-float -D_NDK_MATH_NO_SOFTFP=1 -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -funwind-tables -fexceptions -frtti -Wl,--no-warn-mismatch -Wl,-lm_hard" FF_EXTRA_CFLAGS="-DANDROID -fPIC -ffunction-sections -funwind-tables -fstack-protector -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 " FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID " ;; neon|armv7a-neon) TOOLCHAIN_BASE="arm-linux-androideabi" TOOLNAME_BASE="arm-linux-androideabi" AOSP_ABI="armeabi-v7a" AOSP_ARCH="arch-arm" HOST="arm-linux-androideabi" AOSP_FLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -funwind-tables -fexceptions -frtti" FF_EXTRA_CFLAGS="-DANDROID -fPIC -ffunction-sections -funwind-tables -fstack-protector -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 " FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID " ;; armv8|armv8a|aarch64|arm64|arm64-v8a) TOOLCHAIN_BASE="aarch64-linux-android" TOOLNAME_BASE="aarch64-linux-android" AOSP_ABI="arm64-v8a" AOSP_ARCH="arch-arm64" HOST="aarch64-linux" AOSP_FLAGS="-funwind-tables -fexceptions -frtti" FF_EXTRA_CFLAGS="" FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID " ;; mips|mipsel) TOOLCHAIN_BASE="mipsel-linux-android" TOOLNAME_BASE="mipsel-linux-android" AOSP_ABI="mips" AOSP_ARCH="arch-mips" HOST="mipsel-linux" AOSP_FLAGS="-funwind-tables -fexceptions -frtti" ;; mips64|mipsel64|mips64el) TOOLCHAIN_BASE="mips64el-linux-android" TOOLNAME_BASE="mips64el-linux-android" AOSP_ABI="mips64" AOSP_ARCH="arch-mips64" HOST="mipsel64-linux" AOSP_FLAGS="-funwind-tables -fexceptions -frtti" ;; x86) TOOLCHAIN_BASE="x86" TOOLNAME_BASE="i686-linux-android" AOSP_ABI="x86" AOSP_ARCH="arch-x86" HOST="i686-linux" AOSP_FLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -funwind-tables -fexceptions -frtti" FF_EXTRA_CFLAGS="-O3 -DANDROID -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -fomit-frame-pointer -march=k8 " FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID " ;; x86_64|x64) TOOLCHAIN_BASE="x86_64" TOOLNAME_BASE="x86_64-linux-android" AOSP_ABI="x86_64" AOSP_ARCH="arch-x86_64" HOST="x86_64-linux" AOSP_FLAGS="-march=x86-64 -msse4.2 -mpopcnt -mtune=intel -funwind-tables -fexceptions -frtti" FF_EXTRA_CFLAGS="-O3 -DANDROID -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -fomit-frame-pointer -march=k8 " FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID " ;; *) echo "ERROR: Unknown architecture $1" [ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1 ;; esac echo "TOOLCHAIN_BASE="$TOOLCHAIN_BASE echo "TOOLNAME_BASE="$TOOLNAME_BASE echo "AOSP_ABI="$AOSP_ABI echo "AOSP_ARCH="$AOSP_ARCH echo "AOSP_FLAGS="$AOSP_FLAGS echo "HOST="$HOST
问题
- C compiler cannot create executables
checking whether the C compiler works... no
configure: error: in `/home/iyfangfeng/libsrc/ffmpeg/basic/clangffmpeg0511/fdk-aac-0.1.6':
configure: error: C compiler cannot create executables
See `config.log' for more details
解决:
之前使用的是clang ndk-r19c的编译环境建议换成r10e或者r14 不能使用r16b 有问题
-
fatal error: stdio.h: No such file or directory
libSYS/src/cmdl_parser.cpp:96:19: fatal error: stdio.h: No such file or directory #include <stdio.h> ^ compilation terminated. Makefile:1270: recipe for target 'libSYS/src/cmdl_parser.lo' failed make: *** [libSYS/src/cmdl_parser.lo] Error 1 make: *** 正在等待未完成的任务.... libSYS/src/genericStds.cpp:95:18: fatal error: math.h: No such file or directory
百度后说:改用ndk-r14b,因为r16b目录结构改了。 这有可能,我换的是 r10e 这个之前用的最多 https://www.jianshu.com/p/38894c45daf0
确实编译过了 遇到类似问题可以换版本试试 android-ndk-r10e
-
编译器路径一直都还是之前项目的
重新创建一个目录,再下载一个版本 oK
-
Unknown option “–enalbe-demuxer=flv”.
Unknown option "--enalbe-demuxer=flv".
See ./configure --help for available options.
除了报错这个外海包含其他的错误,可能是这个版本不支持flv 解复用,可以编译选项中删除掉
使用
可以在Android Studio 上面演示,暂时没有完全独立的demo,用得人多再补吧,先编译
技术支持
按照如上提供的步骤,如果还存在问题,可以找我获取可以使用的so库、源码、脚本、带环境及源码的虚拟机。应该有地方可以获取名片。promptpe