环境 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. Python 创建用户界面之 PyQt5 的使用

    之前给大伙介绍了下 tkinter,有朋友希望小帅b对其它的 Python  GUI 框架也说道说道,那么今天就来说说 PyQt5 如何创建用户界面.   很多人学习python,不知道从何学起.很多 ...

  2. windows系统下python setup.py install ---出现cl问题,cpp_extension.py:237: UserWarning: Error checking compiler version for cl: 'utf-8' codec can't decode byte 0xd3 in position 0: invalid continuation byte

    将cpp_extension.py文件中的 原始的是   compiler_info.decode() try: if sys.platform.startswith('linux'): minimu ...

  3. leetcode刷题笔记-1. 两数之和(java实现)

    题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使 ...

  4. 2020-07-14:es用过冷热分离吗?假如现在有些数据热变冷,有些数据冷变热,怎么解决?

    福哥答案2020-07-14: 热变冷: 有x台机器tag设置为hot. 有y台机器tag设置为cool. hot集群中只存最近两天的. 有一个定时任务每天将前一天的索引标记为cool. es看到有新 ...

  5. C#LeetCode刷题之#415-字符串相加(Add Strings)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3873 访问. 给定两个字符串形式的非负整数 num1 和num2 ...

  6. 触发链模式之使用jdk的Observable和Observerver实现触发链模式(附JDK源码)

    首先看看JDK的Observer接口 public interface Observer { void update(Observable o, Object arg); } 也就一个更新的方法,这里 ...

  7. 精讲RestTemplate第10篇-使用代理作为跳板发送请求

    本文是精讲RestTemplate第10篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层 ...

  8. Android TextView 字数过多,用跑马灯滚动形式实现

    上代码: <TextView android:layout_width="120dp" android:layout_height="wrap_content&qu ...

  9. JavaScript学习系列博客_11_JavaScript中的for语句

    for循环 - 语法: for(①初始化表达式 ; ②条件表达式 ; ④更新表达式){ ③语句... } - 执行流程: 首先执行①初始化表达式,初始化一个变量,(这里只会执行一次) 然后对②条件表达 ...

  10. golang mysql demo

    Go操作Mysql数据库 使用Go操作MySQL等数据库,一般有两种方式:一是使用database/sql接口,直接在代码里硬编码sql语句:二是使用gorm,即对象关系映射的方式在代码里抽象的操作数 ...