热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MACAndroidStudioNDK环境环境下FFmpeg的编译

MAC-AndroidStudio-NDK环境环境下FFmpeg的编译环境:macOS10.15.4AndroidStudio3.5.3ffmpeg3.3.6nd

MAC-AndroidStudio-NDK环境环境下FFmpeg的编译


环境:

mac OS 10.15.4
AndroidStudio 3.5.3
ffmpeg 3.3.6
ndk android-ndk-r15c
platform android-21

配置

操作步骤:
1.修改configure,去掉so文件输出时的版本信息
修改内容如下:

#修改前
#SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
#修改前
#SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
#修改前
#SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
SLIB_INSTALL_LINKS='\$(SLIBNAME)'

2.创建build_android.sh文件,并增加内容如下:

#!/bin/bash
# 修改为自己NDK包根目录
export NDK_HOME=「你下载的NDK解压目录」如:/Users/用户/android-ndk-r15c
#根据自己的需求修改编译平台版本
export PLATFORM_VERSION=android-21「根据你的需要修改」
#定义编译方法
function build
{#echo 输出命令echo "start build ffmpeg for $ARCH"#调用configure命令开始编译,并传入对应的参数./configure --target-os=linux \--prefix=$PREFIX --arch=$ARCH \--disable-doc \--disable-static \--disable-yasm \--disable-asm \--disable-symver \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-ffserver \--cross-prefix=$CROSS_COMPILE \--enable-cross-compile \--enable-shared \--enable-gpl \--sysroot=$SYSROOT \--enable-small \--extra-cflags="-Os -fpic $ADDI_CFLAGS" \--extra-ldflags="$ADDI_LDFLAGS" \$ADDITIONAL_CONFIGURE_FLAGmake cleanmakemake installecho "build ffmpeg for $ARCH finished"
}#编译 arm-v7a
PLATFORM_VERSION=android-21「根据你的需要修改」
ARCH=x86_64「根据你的需要修改,如下:其它配置方案」
CPU=x86_64 #CPU架构
PREFIX=$(pwd)/android_all/$CPU #输出路径:当前目录/android_all/CPU架构/
TOOLCHAIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi- #交叉编译环境路径
ADDI_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -mfpu=neon"
ADDI_LDFLAGS="-march=armv7-a -Wl,--fix-cortex-a8"
SYSROOT=$NDK_HOME/platforms/$PLATFORM_VERSION/arch-$ARCH/
build

其它配置方案:

#arm
PLATFORM_VERSION=android-14
ARCH=arm
CPU=armeabi#arm-v7a
PLATFORM_VERSION=android-14
ARCH=arm
CPU=armeabi-v7a#arm64
PLATFORM_VERSION=android-21
ARCH=arm64
CPU=arm64#x86
PLATFORM_VERSION=android-14
ARCH=x86
CPU=x86#x86_64
PLATFORM_VERSION=android-21
ARCH=x86_64
CPU=x86_64#mips
PLATFORM_VERSION=android-14
ARCH=mips
CPU=mips#mips64
PLATFORM_VERSION=android-21
ARCH=mips64
CPU=mips64

3.执行build_android.sh文件
这里有几个需要注意的地方
1.修改build_android.sh为可执行文件,方法如下:

chmod 777 build_android.sh

2.解除mac对任何来源的应用程序运行的限制

sudo spctl --master-disable

使用此命令可以检查一下你的系统设置安全与隐私的
在这里插入图片描述
是否可以允许任何来源

3.运行build_android.sh脚本

sudo ./build_android.sh

编译过程大概需要五六分钟左右,编译完成后可以根据脚本中你指定的输出目录中查看编译好的so文件,脚本默认输出目录是:ffmpeg当前目录/android_all/CPU架构/ , 类似如下图所示:
在这里插入图片描述

备注:我在使用过程中遇到的其它问题

在mac系统下编译x86_64的so时候,提示


yasm/nasm not found or too old. Use --disable-yasm for a crippled build.

解决办法参考:https://blog.csdn.net/l1028386804/article/details/80976376

原文内容:
===------------------------
安装ffmpeg过程中,执行./configure时,报yasm/nasm not found or too old. Use --disable-yasm for a crippledbuild错误,分析、解决如下:

分析:yasm是汇编编译器,ffmpeg为了提高效率使用了汇编指令,如MMX和SSE等。所以系统中未安装yasm时,就会报上面错误。

解决:安装yasm编译器。安装方法如下:

在http://www.tortall.net/projects/yasm/releases下面找到适合自己平台的yasm版本。然后进行安装。举例如下:

1)下载:wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz「可以手动下载到mac本地」

2)解压:tar zxvf yasm-1.3.0.tar.gz「可手动解压」

3)切换路径: cd yasm-1.3.0

4)执行配置: ./configure

5)编译:make

6)安装:make install
===------------------------

另一种build_android.sh配置方案

#!/bin/shMY_LIBS_NAME=ffmpeg-3.3.6
MY_DIR=ffmpeg-3.3.6# cd ./${MY_DIR}#编译的过程中产生的中间件的存放目录,为了区分编译目录,源码目录,install目录
MY_BUILD_DIR=binaryNDK_PATH=/Users/xxxx/Downloads/android-ndk-r15c
BUILD_PLATFORM=darwin-x86_64
TOOLCHAIN_VERSION=4.9
ANDROID_VERSION=21ANDROID_ARMV5_CFLAGS="-march=armv5te"
ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon" #-mfloat-abi=hard -mfpu=vfpv3-d16 #-mfloat-abi=hard -mfpu=vfp
ANDROID_ARMV8_CFLAGS="-march=armv8-a"
ANDROID_X86_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"# params($1:arch,$2:arch_abi,$3:host,$4:cross_prefix,$5:cflags)
build_bin() {echo "-------------------star build $2-------------------------"ARCH=$1 # arm arm64 x86 x86_64ANDROID_ARCH_ABI=$2 # armeabi armeabi-v7a x86 mipsPREFIX=$(pwd)/dist/${MY_LIBS_NAME}/${ANDROID_ARCH_ABI}/HOST=$3SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-${ARCH}CFALGS=$5TOOLCHAIN=${NDK_PATH}/toolchains/${HOST}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}CROSS_PREFIX=${TOOLCHAIN}/bin/$4-# build 中间件BUILD_DIR=./${MY_BUILD_DIR}/${ANDROID_ARCH_ABI}echo "pwd==$(pwd)"echo "ARCH==${ARCH}"echo "PREFIX==${PREFIX}"echo "HOST==${HOST}"echo "SYSROOT=${SYSROOT}"echo "CFALGS=$5"echo "CFALGS=${CFALGS}"echo "TOOLCHAIN==${TOOLCHAIN}"echo "CROSS_PREFIX=${CROSS_PREFIX}"#echo "-------------------------按任意键继续---------------------"#read -n 1#echo "-------------------------继续执行-------------------------"#mkdir -p ${BUILD_DIR} #创建当前arch_abi的编译目录,比如:binary/armeabi-v7a#cd ${BUILD_DIR} #此处 进了当前arch_abi的2级编译目录./configure \--prefix=${PREFIX} \--target-os=linux \--arch=${ARCH} \--sysroot=$SYSROOT \--enable-cross-compile \--cross-prefix=${CROSS_PREFIX} \--extra-cflags="$CFALGS -Os -fPIC -DANDROID -Wfatal-errors -Wno-deprecated" \--extra-cxxflags="-D__thumb__ -fexceptions -frtti" \--extra-ldflags="-L${SYSROOT}/usr/lib" \--enable-shared \--enable-asm \--enable-neon \--disable-encoders \--enable-encoder=aac \--enable-encoder=mjpeg \--enable-encoder=png \--disable-decoders \--enable-decoder=aac \--enable-decoder=aac_latm \--enable-decoder=h264 \--enable-decoder=mpeg4 \--enable-decoder=mjpeg \--enable-decoder=png \--disable-demuxers \--enable-demuxer=image2 \--enable-demuxer=h264 \--enable-demuxer=aac \--disable-parsers \--enable-parser=aac \--enable-parser=ac3 \--enable-parser=h264 \--enable-gpl \--disable-doc \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-symver \--disable-debug \--enable-smallmake cleanmakemake install#从当前arch_abi编译目录跳出,对应上面的cd ${BUILD_DIR},以便function多次执行#cd ../../echo "-------------------$2 build end-------------------------"
}#根据你的需要接注释对应的方法就可以了
# build armeabi
#build_bin arm armeabi arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV5_CFLAGS"#build armeabi-v7a
#build_bin arm armeabi-v7a arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV7_CFLAGS"#build arm64-v8a
#build_bin arm64 arm64-v8a aarch64-linux-android aarch64-linux-android "$ANDROID_ARMV8_CFLAGS"#build x86
#build_bin x86 x86 x86 i686-linux-android "$ANDROID_X86_CFLAGS"#build x86_64
build_bin x86_64 x86_64 x86_64 x86_64-linux-android "$ANDROID_X86_64_CFLAGS"


推荐阅读
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 获取计算机硬盘序列号的方法与实现
    本文介绍了如何通过编程方法获取计算机硬盘的唯一标识符(序列号),并提供了详细的代码示例和解释。此外,还涵盖了如何使用这些信息进行身份验证或注册保护。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 本文详细介绍了如何规划和部署一个高可用的Etcd集群,包括主机配置、软件安装、防火墙设置及集群健康检查等内容。通过合理的硬件配置和网络规划,确保Etcd集群在生产环境中的稳定运行。 ... [详细]
  • Windows 7 64位系统下Redis的安装与PHP Redis扩展配置
    本文详细介绍了在Windows 7 64位操作系统中安装Redis以及配置PHP Redis扩展的方法,包括下载、安装和基本使用步骤。适合对Redis和PHP集成感兴趣的开发人员参考。 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
author-avatar
妹纸叫BLACK
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有