当前位置: 首页 > article >正文

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


http://www.kler.cn/a/105714.html

相关文章:

  • C++ —— string类(上)
  • Linux一些常用的系统优化
  • Proteus 8.17的详细安装教程
  • ssh无法连接Ubuntu
  • 【经验分享】2024年11月下半年软件设计师考试选择题估分(持续更新~~)
  • ggplot2-scale_x_continuous()
  • linux可视化运维工具
  • 如何在Postman中使用静态HTTP
  • Kubernetes 特性门控
  • 全连接层是什么,有什么作用?
  • 域控操作三点五:使用策略下发将域用户添加到本地管理员组
  • 【干货】JVS低代码表单基础组件的配置与应用
  • SPP Net 目标检测网络学习笔记 (附代码)
  • DevOps持续集成-Jenkins(1)
  • stm32的ADC采样率如何通过Time定时器进行控制
  • 【表面缺陷检测】钢轨表面缺陷检测数据集介绍(2类,含xml标签文件)
  • R语言代码示例
  • 包管理工具与配置文件package.json
  • UI设计中设计文章列表左右的思考优漫动游
  • 从【臀部监控】到【电脑监控软件】,企业如何在隐私权与管理权博弈中找到平衡
  • 分享一款基于 AI 的 Chrome 插件
  • Ubuntu 下 VSCode Tab 间距非常小解决方案
  • 导入Embassy库进行爬虫
  • 云原生Docker数据管理
  • Mac怎么删除文件和软件?苹果电脑删除第三方软件方法
  • labelimg使用以及xml和txt转化