• 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
    
    • 1
    • 2

    NDK版本:

    /home/iyfangfeng/libsrc/tools/android-ndk-r19c
    
    • 1

    以下只编译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$ 
      
      
      • 1
      • 2
      • 3
      • 4

    源码下载

    ffmpeg-3.3.8.tar.gz 
    
    • 1
    • 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
    
    
    • 1
    • 2
    • 3
    • 4

    ./build_ffmpeg.sh 使用的是gcc 编译脚本

    编译脚本
    • 最简单的目录结构

      iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ ls
      build_ffmpeg.sh  config.sh   libs   ffmpeg-3.3.8
      
      • 1
      • 2
    • 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 ..
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 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
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78
      • 79
      • 80
      • 81
      • 82
      • 83
      • 84
      • 85
      • 86
      • 87
      • 88
      • 89
      • 90
      • 91
      • 92
      • 93
      • 94
      • 95
      • 96
      • 97
      • 98
      • 99
      • 100
      • 101
      • 102
      • 103
      • 104
      • 105
      • 106
      • 107
      • 108
      • 109
      • 110
      • 111
      • 112
      • 113
      • 114
      • 115
      • 116
      • 117
      • 118
      • 119
      • 120
      • 121
      • 122
      • 123
      • 124
      • 125
      • 126
      • 127
      • 128
      • 129
      • 130
    问题
    • 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
    
    • 1
    • 2
    • 3
    • 4

    解决:

    之前使用的是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 
                         ^
      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
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

      百度后说:改用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.
    
    • 1
    • 2

    除了报错这个外海包含其他的错误,可能是这个版本不支持flv 解复用,可以编译选项中删除掉

    使用

    可以在Android Studio 上面演示,暂时没有完全独立的demo,用得人多再补吧,先编译

    技术支持

    按照如上提供的步骤,如果还存在问题,可以找我获取可以使用的so库、源码、脚本、带环境及源码的虚拟机。应该有地方可以获取名片。promptpe

  • 相关阅读:
    南大通用GBase8s 常用SQL语句(240)
    Linux系统Docker部署Nexus Maven并实现远程访问本地管理界面
    java基于ssm的电子资源管理系统 毕业设计
    企业级C++项目那些事(1):VS&Qt相关设置
    Android绑定式服务
    Leetcode 22. 括号生成
    Python 中 staticmethod 和 classmethod 原理
    JWT简单介绍
    Ti AM335X工控模块的ubuntu系统定制与使用-连载 (一)
    位置变量及实例
  • 原文地址:https://blog.csdn.net/abcdabcdqqq/article/details/134071995