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


推荐阅读
  • FFPlay 字幕与LRC歌词播放指南
    本文详细介绍了不同媒体容器支持的字幕格式,以及如何使用FFPlay和FFMPEG进行字幕和LRC歌词的播放与转换。涵盖的内容包括字幕显示方法、字体配置、字幕流选择等。 ... [详细]
  • 本文介绍如何在Mac OS X系统上安装和配置Frida工具,以及如何利用该工具在已越狱的iOS设备上进行应用程序的破解。主要内容包括Frida的安装步骤、环境配置、证书验证问题的解决方法等。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细探讨了在Android 8.0设备上使用ChinaCock的TCCBarcodeScanner进行扫码时出现的应用闪退问题,并提供了解决方案。通过调整配置文件,可以有效避免这一问题。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 本文介绍了在MacOS上通过Homebrew安装Anaconda3,并配置环境变量以实现不同Python版本之间的快速切换。同时,提供了详细的步骤来创建和管理多个Python环境。 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
  • 前言ReactNative是目前最流行的跨平台框架,并且是Facebook团队开源的项目。架构及实现技术上都有很高的研究价值,本系列就来分析一下Reac ... [详细]
  • 本文介绍了如何使用Workman框架构建一个功能全面的即时通讯系统,该系统不仅支持一对一聊天、群组聊天,还集成了视频会议和实时音视频通话功能,同时提供了红包发送等附加功能。 ... [详细]
  • 本文分享了作者在不同版本的Ubuntu系统上尝试编译VLC for Android的经历,包括遇到的技术难题及解决方案,旨在帮助开发者避免常见的编译问题。 ... [详细]
  • 在Ubuntu 18.04上使用Nginx搭建RTMP流媒体服务器
    本文详细介绍了如何在Ubuntu 18.04上使用Nginx和nginx-rtmp-module模块搭建RTMP流媒体服务器,包括环境搭建、配置文件修改和推流拉流操作。适用于需要搭建流媒体服务器的技术人员。 ... [详细]
  • 在Java开发中,如何利用ProcessBuilder类调用外部程序是一个常见的需求。本文将详细介绍ProcessBuilder类的使用方法,并提供示例代码帮助你更好地理解和应用。 ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
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社区 版权所有