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/bashARCH=$1source config.sh $ARCH
LIBS_DIR=$(cd `dirname $0`; pwd)/libs/lib-ffmpeg
echo "LIBS_DIR="$LIBS_DIRcd ffmpeg-3.3.8PLATFORM=$ANDROID_NDK_ROOT/platforms/$AOSP_API/$AOSP_ARCH
TOOLCHAIN=$ANDROID_NDK_ROOT/toolchains/$TOOLCHAIN_BASE-$AOSP_TOOLCHAIN_SUFFIX/prebuilt/linux-x86_64PREFIX=$LIBS_DIR/$AOSP_ABIecho ===============================
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 installcd ..
  • 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-r10eexport AOSP_TOOLCHAIN_SUFFIX=4.9export AOSP_API="android-21"#架构
    if [ "$#" -lt 1 ]; thenTHE_ARCH=armv7
    elseTHE_ARCH=$(tr [A-Z] [a-z] <<< "$1")
    fi#根据不同架构配置环境变量
    case "$THE_ARCH" inarm|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;;
    esacecho "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.mzph.cn/news/120112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NodeRed 配置 Modbus

2023-10-27 点右上角添加之后&#xff0c;选择这个服务。为了好记。我把名称改成了&#xff1a;127.0.0.1:502 点右上角[完成] 出来了

如何在filters中使用data中数据?

在vue2.x中使用filters功能,如果想在filter中使用this调用data中的数据,会报错,因为this不是指向vue组件实例。 如果想用data中的数据,一般有两种方式: 1.在使用filter时传入data中数据,如: <template> <div> 目前选择的是:{{ type | convertText…

做外贸要时常做复盘总结

外贸的工作其实是阶段性的&#xff0c;所谓的阶段性就是有的时候客户可能会扎堆的出现。然后一天的工作几乎都是在和各个客户沟通中度过&#xff0c;比如报价&#xff0c;做表格等等&#xff0c;然后就会觉得这一天过的很快&#xff0c;也很充实。 然而实质上当我们回顾这一天…

70 搜索插入位置

搜索插入位置 题解1 二分查找防越界写法 题解2 STL大法两行 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c; 并返回其索引。如果目标值不存在于数组中&#xff0c; 返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O ( l o g n ) O(log n…

node开发微信群聊机器人第⑤章

▍PART 序 看本文时&#xff0c;请确保前4章都已经看过&#xff0c;不然本章你看着看着思维容易跳脱&#xff01;再一个机器人教程只在公众号&#xff1a;“程序员野区”首发。csdn会跟着发一份&#xff0c;未经博主同意&#xff0c;请勿转载&#xff01;欢迎分享到自己的微信…

记一次EasyExcel导出时将空格丢失的问题

EasyExcel的issues可以看到 需求&#xff1a;导出的数据以树形展示&#xff0c;如下&#xff1a; 导出结果&#xff1a; 原因&#xff1a; EasyExcel会默认去除掉空格&#xff0c;autoTrim熟悉默认为true&#xff0c;只需要设置为false即可。

Kafka-Java二:Spring实现kafka消息发送的ack机制

写在前面 如果只有一个kafka实例的话&#xff0c;那么文章中提到kafka集群kafka实例 一、什么是消息发送者端的ack机制 ack机制&#xff1a;消息确认发送成功的标识 由谁发起该标识&#xff1a;kafka集群 发起该标识的场景&#xff1a;kafka集群确认已经收到了消息。 由谁接收…

低代码软件的价格考量:成本效益与投资回报

数字化转型的今天&#xff0c;我们常听到“低代码”这个概念&#xff0c;那低代码软件价格到底如何呢&#xff1f;很多厂商并没有公布软件价格情况&#xff0c;让很多企业在采购的时候也是一头雾水。当然&#xff0c;市场上也存在一些厂商公开透明价格&#xff0c;比如Zoho Cre…

Blueprints - 虚幻中的行为树(Behavior Tree)

一些以前的学习笔记归档&#xff1b; 简单的说&#xff0c;行为树可以让agent&#xff08;代理&#xff0c;指可以自主活动的游戏角色等&#xff09;做出决定&#xff0c;可以理解为AI的大脑&#xff1b; 行为树自上而下的从树的根节点&#xff08;Root节点&#xff09;开始读…

2016年亚太杯APMCM数学建模大赛C题影视评价与定制求解全过程文档及程序

2016年亚太杯APMCM数学建模大赛 C题 影视评价与定制 原题再现 中华人民共和国成立以来&#xff0c;特别是政治改革和经济开放后&#xff0c;随着国家经济的增长、科技的发展和人民生活水平的提高&#xff0c;中国广播电视媒体取得了显著的成就&#xff0c;并得到了迅速的发展…

Ajax、Json深入浅出,及原生Ajax及简化版Ajax

Ajax 1.路径介绍 1.1 JavaWeb中的路径 在JavaWeb中&#xff0c;路径分为相对路径和绝对路径两种&#xff1a; 相对路径&#xff1a; ./ 表示当前目录(可省略) ../ 表示当前文件所在目录的上一级目录 绝对路径&#xff1a; http://ip:port/工程名/资源路径 2.2 在JavaWeb中…

智慧停车视频解决方案:如何让AI助力停车管理升级?

一、项目背景 停车场的管理区域由于面积比较大&#xff0c;进出车辆多&#xff0c;所以在保安方面决不能有任何的麻痹和松懈&#xff0c;继续采用过去保安方式已远远不能满足现代安全防范的需求。为满足停车场的安全和科学系统化管理的需要&#xff0c;以及为了对随时发生的情…

STM32-程序占用内存大小计算

STM32中程序占用内存容量 Keil MDK下Code, RO-data,RW-data,ZI-data这几个段: Code存储程序代码。 RO-data存储const常量和指令。 RW-data存储初始化值不为0的全局变量。 ZI-data存储未初始化的全局变量或初始化值为0的全局变量。 占用的FlashCode RO Data RW Data; 运行消…

支持向量机(SVM)

一. 什么是SVM 1. 简介 SVM&#xff0c;曾经是一个特别火爆的概念。它的中文名&#xff1a;支持向量机&#xff08;Support Vector Machine, 简称SVM&#xff09;。因为它红极一时&#xff0c;所以关于它的资料特别多&#xff0c;而且杂乱。虽然如此&#xff0c;只要把握住SV…

291_C++_发送json数据给对于的URL【JSON数据交互】

元编程技巧 {boost::mpl::bool的使用,在编译时进行条件编程时,能够表示和操作布尔值。这里进行了封装使用对模版T进行判断} + 对原JSON库 rapidjson::Document 的使用 1、头文件中的:命令空间、模版结构体、结构体、map容器 namespace __smart_buffer_detail{BOOST_TTI_HA…

二进制安装部署k8s

概要 常见的K8S按照部署方式 minikube 是一个工具&#xff0c;可以在本地快速运行一个单节点微型K8S&#xff0c;仅用于学习&#xff0c;预习K8S的一些特性使用。 Kubeadmin kubeadmin也是一个工具&#xff0c;特工kubeadm init 和kubedm join&#xff0c;用于快速部署k8s…

JAVA基础

jdk jdk是什么呢?jdk的是java development kit的缩写&#xff0c;意思是java程序开发的工具包。也可以说jdk是java的sdk。 JDK是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心&#xff0c;它包含了JAVA的运…

ubuntu 22.04 设置 apt 代理 配置 清华源 add-apt-repository 代理

另一种临时代理 export http_proxyhttp://<proxy>:<port> export https_proxyhttp://<proxy>:<port> sudo -E add-apt-repository ppa:linaro-maintainers/toolchainhttps://askubuntu.com/questions/53146/how-do-i-get-add-apt-repository-to-work-…

谷歌云的利润增长才刚刚开始

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;自从Google Cloud(谷歌云&#xff09;今年开始盈利以来&#xff0c;投资者都在怀疑这种盈利能力能否持续下去。 &#xff08;2&#xff09;虽然微软Azure目前在全球的人工智能竞…

【开源】基于SpringBoot的高校学院网站的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学院院系模块2.2 竞赛报名模块2.3 教育教学模块2.4 招生就业模块2.5 实时信息模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学院院系表3.2.2 竞赛报名表3.2.3 教育教学表3.2.4 招生就业表3.2.5 实时信息表 四、系…