环境 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. IDEA生成MyBatis文件

    IDEA 逆向 MyBatis 工程时,不像支持 Hibernate 那样有自带插件,需要集成第三方的 MyBatis Generator. MyBatis Generator的详细介绍 http:/ ...

  2. java数组的拷贝和扩容

    1.拷贝arraycopy方法 // 拷贝:arraycopy方法 // arraycopy // 第一个参数:原数组 // 第二个参数:原数组元素的起始位置 // 第三个参数:目标数组 // 第四个 ...

  3. java 序列化流与反序列化流

    一 对象序列化流ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInputStr ...

  4. 制作 macOS Sierra U盘USB启动安装盘方法教程 (亲测)

    备注:相关镜像到apple官网下载 https://discussionschinese.apple.com/thread/250596904 进去点击"请使用这个 App Store 链接 ...

  5. ReentrantLock与synchronized 源码解析

    一.概念及执行原理   在 JDK 1.5 之前共享对象的协调机制只有 synchronized 和 volatile,在 JDK 1.5 中增加了新的机制 ReentrantLock,该机制的诞生并 ...

  6. C#LeetCode刷题之#48-旋转图像(Rotate Image)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3668 访问. 给定一个 n × n 的二维矩阵表示一个图像. 将 ...

  7. Vue Element-UI 中列表单选的实现

    el-table中单选的实现 引用场景: 选择单条数据进行业务操作 实现方式: 给el-table-column设置el-radio Template 代码 <div class="r ...

  8. HTML5+css3 的开心网游戏页面

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. 大侠稍等!URL 中为何出现奇怪的字符

    为什么中文名称的图片打开后网址是一串乱码?为什么好好的短网址复制粘贴就变长了一大长串?罪魁祸首居然是-- 杭州终于出梅了!二狗子看到气象台发布的消息,开心的不得了.杭州的雨从五月底一直下,每天除了雨还 ...

  10. JMX基本概念

    Object name的语法 形似 com.sun.someapp:type=Whatsit,name=25 com.sun.someapp 是domain,冒号后面的是key-property-li ...