NDK交叉编译FFmpeg安卓编译ffmpeg

NDK交叉编译FFmpeg安卓编译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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
编译FFmpeg 6.0时,需要使用NDK 21版本进行相关操作。 首先,我们需要安装NDK并配置环境变量。可以从官方网站(developer.android.com/ndk)下载NDK安装包,并按照指示进行安装。安装完成后,将NDK的路径添加到系统环境变量中。 然后,我们需要获取FFmpeg 6.0版本的源代码。可以从FFmpeg的官方网站(ffmpeg.org)下载最新版本的源代码压缩包,并解压到本地目录中。 接下来,打开终端或命令提示符,并进入FFmpeg源代码所在的目录。执行以下命令进行配置: ./configure --arch=arm --cpu=armv7-a --target-os=android --enable-cross-compile --cross-prefix=arm-linux-androideabi- --sysroot=/path/to/ndk/sysroot --extra-cflags='-isysroot /path/to/ndk/sysroot/arch-arm -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb' --extra-ldflags='-Wl,-rpath-link=/path/to/ndk/sysroot/usr/lib/arm-linux-androideabi/,-L/path/to/ndk/sysroot/usr/lib/arm-linux-androideabi/ -nostdlib' --prefix=/path/to/output/directory 请确保将上述命令中的"/path/to/ndk"替换为NDK的实际路径,"/path/to/output/directory"替换为输出目录的实际路径。 配置完成后,执行以下命令进行编译: make -j4 其中"-j4"表示使用4个线程进行编译,可以根据实际情况进行调整。 编译完成后,执行以下命令进行安装: make install 至此,FFmpeg 6.0的编译过程就完成了。编译后的二进制文件和相关库将安装到指定的输出目录中。 需要注意的是,在编译过程中可能会遇到一些依赖项缺失的情况,需要根据具体错误信息进行处理。另外,NDK版本和FFmpeg版本之间的兼容性也需要注意,有时需要向上或向下调整NDK版本以确保编译成功。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢爱

VX找我475566936

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值