环境 macOS 10.15.4    NDK 21.3.6528147   ffmpeg 4.2.3

1.执行sudo xcodebuild -license,防止编译的时候找不到一些文件报错

2.下载ffmpeg(4.2.3),解压后进入主目录,修改configure文件,找到

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'

改为:

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

3.下载NDK,我这里直接在Android Studio上下载,路径在~/Library/Android/sdk/ndk/21.3.6528147 ,将NDK路径加入path

编辑~/.bash_profile:

NDK_HOME=~/Library/Android/sdk/ndk/21.3.
PATH=${PATH}:${NDK_HOME} export PATH
export NDK_HOME

执行source ~/.bash_profile,使得路径实时生效

编译脚本android_llvm.sh

#!/bin/sh
# 测试通过 sh android_llvm.sh armv8-a   sh android_llvm.sh armv7a sh android_llvm.sh i686 sh android_llvm.sh x86-64 NDK=${NDK_HOME}
ANDROID_API=29
# armv8-a armv7a aarch64 i686 x86_64
CPU=armv8-a
# arm aarch64 i686 x86_64
ARCH=arm64
PLATFORM=darwin-x86_64
TOOLCHAIN=${NDK}/toolchains/llvm/prebuilt/${PLATFORM} #OPTIMIZE_CFLAGS="-march=$CPU"
if [ "$#" -lt 1 ]; then
    CPU=armv8-a
else
    CPU=$(tr [A-Z] [a-z] <<< "$1")
fi
case ${CPU} in
    arm|armv5|armv6|armv7|armeabi)
    echo ${CPU}
    ;;
    armv7a|armeabi-v7a)
    ARCH=arm
    CC=${TOOLCHAIN}/bin/armv7a-linux-androideabi${ANDROID_API}-clang
    CXX=${TOOLCHAIN}/bin/armv7a-linux-androideabi${ANDROID_API}-clang++
    CROSS_PREFIX=${TOOLCHAIN}/bin/arm-linux-androideabi-
    TOOLNAME_BASE=arm-linux-androideabi
    ;;
    hard|armv7a-hard|armeabi-v7a-hard)
    echo ${CPU}
    ;;
    neon|armv7a-neon)
    ;;
    armv8|armv8-a|aarch64|arm64|arm64-v8a)
    # 验证成功
    ARCH=arm64
    CC=${TOOLCHAIN}/bin/aarch64-linux-android${ANDROID_API}-clang
    CXX=${TOOLCHAIN}/bin/aarch64-linux-android${ANDROID_API}-clang++
    CROSS_PREFIX=${TOOLCHAIN}/bin/aarch64-linux-android-
    TOOLNAME_BASE=aarch64-linux-android
    ;;
    mips|mipsel)
    echo ${CPU}
    ;;
    mips64|mipsel64|mips64el)
    echo ${CPU}
    ;;
    i686)
    ARCH=x86
    CC=${TOOLCHAIN}/bin/i686-linux-android${ANDROID_API}-clang
    CXX=${TOOLCHAIN}/bin/i686-linux-android${ANDROID_API}-clang++
    CROSS_PREFIX=${TOOLCHAIN}/bin/i686-linux-android-
    TOOLNAME_BASE=i686-linux-android
    ;;
    x86-64|x64)
    ARCH=x86_64
    CC=${TOOLCHAIN}/bin/x86_64-linux-android${ANDROID_API}-clang
    CXX=${TOOLCHAIN}/bin/x86_64-linux-android${ANDROID_API}-clang++
    CROSS_PREFIX=${TOOLCHAIN}/bin/x86_64-linux-android-
    TOOLNAME_BASE=x86_64-linux-android
    ;;
esac
echo "CPU:${CPU}"
echo "ARCH:${ARCH}"
# mac下是darwin-x86_64,Windows是windows-x86_64 #TARGET=${CPU}-linux-androideabi
PREFIX=$(pwd)/android/$CPU
SYSROOT=${TOOLCHAIN}/sysroot
PREFIX=$(pwd)/android/$CPU
CFFLAGS="-Os -fpic -march=${CPU}"
LDFLAGS="-marm" #--prefix : 安装目录
#--enable-small : 优化大小
#--disable-programs : 不编译ffmpeg程序(命令行工具),我们是需要获得静态(动态)库。
#--disable-avdevice : 关闭avdevice模块,此模块在android中无用
#--disable-encoders : 关闭所有编码器 (播放不需要编码)
#--disable-muxers :  关闭所有复用器(封装器),不需要生成mp4这样的文件,所以关闭
#--disable-filters :关闭视频滤镜
#--enable-cross-compile : 开启交叉编译(ffmpeg比较**跨平台**,并不是所有库都有这么happy的选项 )
#--cross-prefix: 看右边的值应该就知道是干嘛的,gcc的前缀 xxx/xxx/xxx-gcc 则给xxx/xxx/xxx-
#disable-shared enable-static 不写也可以,默认就是这样的。
#--sysroot:
#--extra-cflags: 会传给gcc的参数
#--arch --target-os : 不给不行,为什么给这些值,见视频 function build_android
{
    ./configure \
    --prefix=${PREFIX} \
    --cross-prefix=${CROSS_PREFIX} \
    --target-os=android \
    --arch=${ARCH} \
    --cpu=${CPU} \
    --sysroot=${SYSROOT} \
    --extra-cflags="-Os -fpic -march=${CPU}" \
    --extra-ldflags=${LDFLAGS} \
    --cc=${CC} \
    --cxx=${CXX} \
    --disable-doc \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-symver \
    --disable-avdevice \
    --disable-static \
    --enable-ffmpeg \
    --enable-cross-compile \
    --enable-jni \
    --enable-neon \
    --enable-hwaccels \
    --enable-gpl \
    --enable-postproc \
    --enable-shared \
    $ADDITIONAL_CONFIGURE_FLAG
    make clean
    make
    make install
}
build_android #合并
#${CROSS_PREFIX}ld -rpath-link=${SYSROOT}/usr/lib -L${SYSROOT}/usr/lib -L${PREFIX}/lib -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o ${PREFIX}/libffmpeg.so \
#    ${PREFIX}/lib/libavcodec.a \
#    ${PREFIX}/lib/libavfilter.a \
#    ${PREFIX}/lib/libavresample.a \
#    ${PREFIX}/lib/libswresample.a \
#    ${PREFIX}/lib/libavformat.a \
#    ${PREFIX}/lib/libavutil.a \
#    ${PREFIX}/lib/libswscale.a \
#    ${PREFIX}/lib/libpostproc.a \
#    ${PREFIX}/lib/libavdevice.a \
#    -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
#    ${TOOLCHAIN}/lib/gcc/${TOOLNAME_BASE}/4.9.x/libgcc.a

常见编译问题:

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

2.

ffmpeg 编译Android的更多相关文章

  1. [原]ffmpeg编译android 硬解码支持库 libstagefright

    最近花了一天时间将ffmpeg/tools/build_stagefright执行成功,主要是交叉编译所需要的各种动态库的支持没链接上,导致各种报错,基本上网络上问到的问题我都碰到了,特此记录下来. ...

  2. FFmpeg编译Android版本

    FFmpeg是很好用的一个音视频库,功能强大,但是用起来并不是很方便.之前一直不想用FFmpeg,因为感觉编译太麻烦,但是到了不得不用的时候了,没办法,参考了网上大神的方法,在这里自己也记录一下方便以 ...

  3. 多媒体开发(7):编译Android与iOS平台的FFmpeg

    编译FFmpeg,一个古老的话题,但小程还是介绍一遍,就当记录.之前介绍怎么给视频添加水印时,就已经提到FFmpeg的编译,并且在编译时指定了滤镜的功能. 但是,在手机盛行的时代,读者可能更需要的是能 ...

  4. 编译Android下可用的FFmpeg+x264

    编译Android下可用的FFmpeg+x264 编译x264: 下载最新版的x264 ftp://ftp.videolan.org/pub/videolan/x264/snapshots/ 1.解压 ...

  5. FFmpeg: mac下手动编译android上使用的FFmpeg(支持x86、armeabi-v7a、arm64-v8a)

    之前一直在linux下编译FFmpeg,最近换电脑了,尝试了下在mac下编译ffmpeg,特记录之. 一. 准备工作 1. 下载FFmpeg.(http://ffmpeg.org/download.h ...

  6. ffmpeg学习笔记-Linux下编译Android动态库

    Android平台要使用ffmpeg就需要编译生成动态库,这里采用Ubuntu编译Android动态库 文件准备 要编译生成Android需要以下文件 NDK ffmpeg源代码 NDK下载 NDK可 ...

  7. ndk开发-ffmpeg编译

    进入模拟器shell: D:\Users\zhouhaitao\AppData\Local\Android\sdk\platform-tools\adb shell ndk编译链接静态库: LOCAL ...

  8. FFmpeg 移植 Android

    近期项目需要解析苹果的HLS流媒体协议,而FFmpeg从0.11.1“Happiness”版本开始,才增加了对HLS协议的支持.目前网上关于FFmpeg编译移植的文章有很多,但大多都是对旧版本的说明. ...

  9. 编译android 4.4.2

    1.获取Android源码 (1)下载repo 在用户目录下创建一个bin文件夹来存放repo,并把该路径设置到环境变量中 mkdir ~/bin PATH=~/bin:$PATH 下载repo脚本 ...

随机推荐

  1. java动态代理——jvm指令集基本概念和方法字节码结构的进一步探究及proxy源码分析四

    前文地址 https://www.cnblogs.com/tera/p/13336627.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...

  2. 虹软人脸识别—版本升级接口修改说明(C#)

    自虹软发布了免费.离线版本人脸识别SDK,在Github上陆续分享了各个版本对应的 C# Demo.因为公司项目一直在使用虹软的SDK,因此每当虹软官网有新版本发布,我都会进行了解,并结合Demo进行 ...

  3. @RestController注解初步理解

    一.在Spring中@RestController的作用等同于@Controller + @ResponseBody. 所以想要理解@RestController注解就要先了解@Controller和 ...

  4. JavaScript小游戏实例:统一着色

    设计如下的简单小游戏. 在面板(画布)中放置10行10列共100个小方块,每个小方块随机在5种颜色中选一种颜色进行着色,在面板的下方,放置对应的5种颜色色块,如图1所示. 图1  “统一着色”游戏界面 ...

  5. Vue组件注册

    全局注册方法 Vue.component('my-component-name', { // ... 选项 ... }) Vue.component('component-a', { /* ... * ...

  6. Flutter 入门

  7. Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable

    Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable接口,泛型 Collection,List,Se ...

  8. Linux 安装 PostgreSQL

    Linux 安装 PostgreSQL CentOS 7 安装 PostgreSQL 10 步骤 官网安装步骤,选择服务器和数据库版本,会给出相应的安装命令 # 安装 yum install -y h ...

  9. ALGEBRA-3 线性映射

    不求甚解 [零空间] 零空间对加法和标量乘法封闭,因此属于子空间:

  10. Remix+Geth 实现智能合约部署和调用详解

    Remix编写智能合约 编写代码 在线调试 实现部署 调用接口 Geth实现私有链部署合约和调用接口 部署合约 调用合约 获得合约实例 通过实例调用合约接口 Remix编写智能合约 编写代码 Remi ...