环境 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.

最新文章

  1. hdu 1030 Delta-wave (C++, 0ms, explanatory comments.) 分类: hdoj 2015-06-15 12:21 45人阅读 评论(0) 收藏
  2. nginx和apache下的url rewrite
  3. C# 带进度条的文件下载
  4. [OC Foundation框架 - 2] NSString 的创建
  5. 封装DB类
  6. spring mvc 自定义Handlermapping
  7. 【性能优化】优化笔记之一:图像RGB与YUV转换优化
  8. bash与sh的区别
  9. C语言得到当前系统时间
  10. CentOS 6.4 安装setuptools 和 pip
  11. javascript中event.clientX和event.clientY用法的注意事项
  12. cnblogs第一天
  13. 临时关闭Mac SIP系统完整性保护机制
  14. [转帖]Huge Page 是否是拯救性能的万能良药?
  15. Spark源码编译,官网学习
  16. 浅谈JavaScript函数重载
  17. leetcode239
  18. python 回溯法 子集树模板 系列 —— 16、爬楼梯
  19. 在ListView中嵌套ListView的事件处理
  20. RC1意思

热门文章

  1. 关于SqlServer那些事1(回归基础)
  2. Python入门看这些,最详细学习书籍推荐
  3. 深度学习模型调优方法(Deep Learning学习记录)
  4. Nginx配置SSL证书,提高网络安全性
  5. java 启动Tomcat报错:The specified JRE installation does not exist
  6. MD5算法——C++实现
  7. 程序流程结构——if语句
  8. Jsp内置对象application之统计浏览网页的次数
  9. CSS动画实例:跳跃的字符
  10. C#连接Oracle数据库,通过EF自动生成与数据库表相关的实体类