热门标签 | 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"


推荐阅读
  • 如何在PHP中安装Xdebug扩展
    本文介绍了如何从PECL下载并编译安装Xdebug扩展,以及如何配置PHP和PHPStorm以启用调试功能。 ... [详细]
  • 在Ubuntu 18.04上使用Nginx搭建RTMP流媒体服务器
    本文详细介绍了如何在Ubuntu 18.04上使用Nginx和nginx-rtmp-module模块搭建RTMP流媒体服务器,包括环境搭建、配置文件修改和推流拉流操作。适用于需要搭建流媒体服务器的技术人员。 ... [详细]
  • 在VS2013中编译FFMPEG时遇到的问题及解决方案
    在使用VS2013编译旧版本FFMPEG库时遇到了一些问题,因为官方并未提供预编译的LIB和DLL文件。由于对Linux环境不熟悉,只能在Windows环境下进行配置和编译。具体步骤如下:首先,下载FFMPEG的源代码;然后,安装必要的编译工具和依赖项;接着,配置Visual Studio 2013的项目设置;最后,解决编译过程中出现的各种错误和警告。通过这些步骤,最终成功编译出所需的FFMPEG库文件。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 深入体验Python的高级交互式Shell - IPython
    IPython 是一个增强型的 Python 交互式 Shell,提供了比标准 Python 控制台更为强大的功能,适用于开发和调试过程。它不仅支持直接执行 Linux 命令,还提供了丰富的特性来提高编程效率。 ... [详细]
  • 在Linux系统中,许多应用程序以源代码的形式提供,这给安装带来了挑战。本文旨在介绍一种简化源码软件安装流程的方法,帮助用户更加轻松地完成安装。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • 本文详细介绍了在Linux操作系统上安装和部署MySQL数据库的过程,包括必要的环境准备、安装步骤、配置优化及安全设置等内容。 ... [详细]
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 本文分享了作者在不同版本的Ubuntu系统上尝试编译VLC for Android的经历,包括遇到的技术难题及解决方案,旨在帮助开发者避免常见的编译问题。 ... [详细]
  • 通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是 ... [详细]
  • 如何处理PHP缺少扩展的问题
    本文将详细介绍如何解决PHP环境中缺少扩展的问题,包括检查当前环境、修改配置文件以及验证修改是否生效的具体步骤,帮助开发者更好地管理和使用PHP扩展。 ... [详细]
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社区 版权所有