介绍通过mac os系统编译给Android平台上可以使用的ffmpeg静态库。

编译ffmpeg的时候,需要在命令行上,配置编译的路径以及设置不同的属性值,如果一个个命令行输入的话,很容易出错,出错的时候修改后所有命令重新输出也麻烦,所以,一般都是写在shell脚本中进行批处理的。

mac os系统默认的shell为bash,我个人使用为shell的终极神器--zsh,具体优点不详细介绍。可以通过命令查看当前平台上的shell解析器

➜  cat /etc/shells/bin/bash/bin/csh/bin/ksh/bin/sh/bin/tcsh/bin/zshShell 教程 | 菜鸟教程-Y1j7gZSLGGbHfqiVAw7O4eYi0VWeLsc49ma&wd=&eqid=fa8abab1000000065b936690

shell脚本的编写,可以参考上面的教程,快速看一下大概,接下来用到再详细去查就好了

直接在ffmpage官网 ,点击download,直接下载最新的release包。

解压.tar.bz2文件

以前用mac的解压工具出现文件损坏,这里直接采用命令行解压

➜  tar xvf ffmpeg-4.0.2.tar.bz2编写shell脚本 进入解压后的文件路径

➜  cd ffmpeg-4.0.2查看帮助信息

➜  ffmpeg-4.0.2 ./configure --helpffmpeg 的编译选项翻译--id-120539.html

输出的编译配置属性,可以参考该链接的大概介绍,或者直接看英文也能知道个大概。

编写shell脚本内容

接下来会再详细介绍shell脚本内容,也可以参考上面的ffmpeg 的编译选项翻译设置不同的参数

#!/bin/bash./configure \--prefix=./androidLibs/armeabi-v7 \--enable-small \--disable-programs \--disable-avdevice \--disable-encoders \--disable-muxers \--disable-filters \--enable-cross-compile \--cross-prefix=/Users/guidongyuan/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi- \--disable-shared \--enable-static \--sysroot=/Users/guidongyuan/Library/Android/sdk/ndk-bundle/platforms/android-21/arch-arm \--extra-cflags="-isystem /Users/guidongyuan/Library/Android/sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11  -O0 -fPIC" \--extra-cflags="-isysroot /Users/guidongyuan/Library/Android/sdk/ndk-bundle/sysroot" \--arch=arm \--target-os=android# 不建议直接把make写在sh文件中# make clean# make install执行shell脚本

检查环境是否正常没有错误

➜  ffmpeg-4.0.2 ./buildffmpeg.sh如果提示权限错误,修改权限重新执行

# 出现权限错误➜  ffmpeg-4.0.2 ./buildffmpeg.shzsh: permission denied: ./test.sh# 修改属性为可执行➜  studyshell chmod +x test.sh输出结果,如果输出各种环境信息,且提示一个WARNING,不用管它,可以继续执行

➜  ffmpeg-4.0.2 ./buildffmpeg.shinstall prefix            ./androidLibs/armeabi-v7source path               .C compiler                /Users/guidongyuan/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gccC library                 bionichost C compiler           gcchost C libraryARCH                      arm (armv7-a)......省略执行make命令

➜  ffmpeg-4.0.2 make clean➜  ffmpeg-4.0.2 make install......省略INSTALL    libavutil/avconfig.hINSTALL    libavutil/ffversion.hGEN    libavutil/libavutil.pcINSTALL    libavutil/libavutil.pc# 最后如果没有提示错误,则表示编译成功查看输出结果

可以看到,根据配置输出对应的.a静态库文件

➜  androidLibs tree armeabi-v7 -L 2armeabi-v7├── include│   ├── libavcodec│   ├── libavfilter│   ├── libavformat│   ├── libavutil│   ├── libswresample│   └── libswscale├── lib│   ├── libavcodec.a│   ├── libavfilter.a│   ├── libavformat.a│   ├── libavutil.a│   ├── libswresample.a│   ├── libswscale.a│   └── pkgconfig└── share  └── ffmpeg11 directories, 6 files如果需要动态库,可以通过把静态库编译为动态库

➜  gcc -shared -o 动态库名称.so -Wl,--whole-archive 静态库名称.a -Wl,--no-whole-archive# --whole-archive: 将未使用的静态库符号(函数实现)也链接进动态库#--no-whole-archive : 默认,未使用不链接进入动态库# 实例# 因为是编译给Android使用的,所以,必须使用交叉编译,不能直接用gcc编译➜  /Users/guidongyuan/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/Users/guidongyuan/Library/Android/sdk/ndk-bundle/platforms/android-21/arch-arm --shared -o libFFmpeg.so -Wl,--whole-archive libavcodec.a libavfilter.a    libavformat.a    libavutil.a      libswresample.a  libswscale.a -Wl,--no-whole-archive# 查看生成的文件,编译成功➜  lslibFFmpeg.so    libavfilter.a   libavutil.a     libswscale.alibavcodec.a    libavformat.a   libswresample.a pkgconfig➜  file libFFmpeg.solibFFmpeg.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, with debug_info, not stripped把编译好的库移动到Android项目中就可以使用了

#!/bin/bash# #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序# 执行configure,后面的为其参数# \为换行符./configure \# 设置生成出来的路径目录,不写则用默认值[/usr/local]--prefix=./androidLibs/armeabi-v7 \--enable-small \--disable-programs \--disable-avdevice \--disable-encoders \--disable-muxers \--disable-filters \# 使用了交叉编译--enable-cross-compile \# 为编译工具指定路径,交叉编译,使用arm架构--cross-prefix=/Users/guidongyuan/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi- \# 关闭输出动态库--disable-shared \# 设置为输出静态库--enable-static \# 指定编译的头文件与库文件的查找目录--sysroot=/Users/guidongyuan/Library/Android/sdk/ndk-bundle/platforms/android-21/arch-arm \# 传递gcc编译的参数(包括查找头文件路径),该属性可以在Android Stuido中获取--extra-cflags="-U_FILE_OFFSET_BITS -isystem /Users/guidongyuan/Library/Android/sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11  -O0 -fPIC" \--extra-cflags="-isysroot /Users/guidongyuan/Library/Android/sdk/ndk-bundle/sysroot" \# 选择机器架构--arch=arm \--target-os=android--extra-cflags

该值可以在Android Studio的支持NDK项目中复制,创建NDK项目可以参考NDK(一):编写第一个JNI项目的内容,具体路径为

注意:FLAGS属性值的其中的-std=c++11和-fno-limit-debug-info在编译的运行上面的.sh文件时提示异常和错误,于是选择把其去掉了。

查找错误

编译的时候,不太可能一次性就成功编译,或多或少会出现异常,就需要查log了,比如:

# 错误输出/Users/guidongyuan/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc is unable to create an executable file.C compiler test failed.Include the log file "ffbuild/config.log" produced by configure as this will helpsolve the problem.出现错误,可以查看config.log的具体内容

arm-linux-androideabi-gcc: error: unrecognized command line option '-fno-limit-debug-info'C compiler test failed.可以看到找不到-fno-limit-debug-info命令,原来是我上面设置--extra-cflags属性值在Android Studio复制多了,去掉重新编译就成功了。

修改minSdkVersion版本

把上面编译好的库放到Android Studio中,运行的时候无法通过,错误为

libavformat/hls.c:834: error: undefined reference to 'atof'libavformat/hlsproto.c:141: error: undefined reference to 'atof'libavcodec/v4l2_buffers.c:439: error: undefined reference to 'mmap64'clang++: error: linker command failed with exit code 1 (use -v to see invocation)出现该错误的原因,是因为上面shell脚本中,指定编译的头文件与库文件的查找目录都是21,这样编译出来的依赖库只能用在minSdkVersion 21的项目中,而我的项目最低是兼容到16,那就要重新修改了16。

修改好再次编译,提示该错误

libavcodec/v4l2_buffers.c:434:44: error: call to 'mmap' declared with attribute error: mmap is not available with _FILE_OFFSET_BITS=64 when using GCC until android-21. Either raise your minSdkVersion, disable _FILE_OFFSET_BITS=64, or switch to Clang.

avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.m.planes[i].length,

^

make: *** [libavcodec/v4l2_buffers.o] Error 1

要不就切换为Clang,要不就disable _FILE_OFFSET_BITS,只能选择后者,在--extra-cflags添加取消宏定义即可。

shell

--extra-cflags="-U_FILE_OFFSET_BITS ......省略“

ffmpeg android mac,Mac上交叉编译ffmpeg For Android相关推荐

  1. 手机linux编译器,在linux上交叉编译helloWorld到android手机上去

    在ubuntu上交叉编译helloWorld到arm64的android手机上去. 这里NDK用的是r19及以上的版本. 1. 安装NDK 这里下载了 android-ndk-r21b,解压到 /ho ...

  2. Android图片粘上后仍错误,android – 在Activity被销毁后,ImageView上的图像丢失了

    我正在尝试创建一个应用程序,我可以让用户选择要在其个人资料中显示的图片.我可以在imageview上浏览和设置他们选择的图像.但是一旦活动被破坏,图像就会丢失.我试图实现onSaveInstanceS ...

  3. android多文件上传错误,在Android中上传大文件而不会出现内存错误

    你尝试过使用过吗? con.setChunkedStreamingMode(1024); 这将帮助您将数据块化为特定大小,这样您就不必将整个文件保留在内存中. 更新: 尝试使用以下方法.我使用此方法上 ...

  4. Wormhole for mac(在Mac上控制iOS和Android设备)

    Wormhole for mac中文免费版是一款非常强大的手机控制软件,Wormhole mac中文版可以让您实现在Mac电脑上控制iOS和Android设备,你可以使用Wormhol在你的Mac上刷 ...

  5. Android开发文件上传格式,(android开发)使用okhttp上传文件

    开发android手机客户端,常常会需要上传文件到服务器,比如:你手机里的照片. 使用okhttp会是一个很好的选择.它使用很简单,而且运行效率也很高. 首先,在 app/build.gradle 的 ...

  6. Mac OS中利用ffmpeg为视频添加字幕

    Mac系统下,利用ffmpeg加字幕 字幕类型 硬字幕,类似视频水印,作为视频的一部分内嵌了. 软字幕,封装字幕,也是内嵌到视频里,不过只是作为渲染,而且需要播放器支持才行. 外挂字幕,就是外部字幕文 ...

  7. Android录屏并利用FFmpeg转换成gif(二)交叉编译FFmpeg源码

    Android录屏并利用FFmpeg转换成gif(二) 写博客时经常会希望用一段动画来演示app的行为,目前大多数的做法是在电脑上开模拟器,然后用gif录制软件录制模拟器屏幕,对于非开发人员来讲这种方 ...

  8. 用android ndk编译ffmpeg,AndroidNDK交叉编译FFMPEG

    1. 简介 在进行安卓音视频开发时,利用安卓NDK工具交叉编译FFmpeg,生成可供安卓平台调用的FFmpeg库是最基础的工作.本篇文章介绍了利用NDK进行FFmpeg编译的具体过程,以及如何在Lin ...

  9. Android NDK(ndk-r16b)交叉编译FFmpeg(3.3.9)

    1.下载FFmpeg(3.3.9) ffmpeg官网:Index of /releases ffmpeg-3.3.9下载链接: http://www.ffmpeg.org/releases/ffmpe ...

最新文章

  1. Lua中使用Sleep函数
  2. 孙鑫老师教学视频学习笔记——单文档中菜单操作
  3. 26. Leetcode 206. 反转链表 (链表-反转链表)
  4. Spring boot的Spring MVC自动配置
  5. “睡服”面试官系列第二十三篇之修饰器(建议收藏学习)
  6. ubuntu 查找qt是否安装_Ubuntu Qt 安装教程--快速下载连接(网盘)
  7. 协方差 方差 以及线性相关理解
  8. 电脑注册表修复清理,以及运行库修复
  9. VML Mathematical Functions
  10. 台式计算机怎么查是32位还是64位,Win7系统怎么看电脑是32位还是64位?
  11. UE4之Control Rig
  12. Deep Learning Networks: CNN-, RNN-
  13. 优课联盟 实境英语 Test for Unit 5
  14. 物联网卡空中开卡技术为物联网发展添砖加瓦
  15. 《HelloGitHub》第 39 期
  16. 《天天向上》最新一期预告:糖果车接驾美少女共赴零食大赏
  17. 电子电路设计——三人抢答电路(D触发器版)
  18. HCIP第十天 交换第一天
  19. myplay.pif、winsys16.dll、scrsys16.dll和AlxRes.exe的分析与解决(ZT)
  20. 很好用的查看音频波形的软件cool edit pro

热门文章

  1. revit 2020 二次开发——在楼板上挖圆形洞(Create circle openning in floor)
  2. mysql表加载到内存
  3. php隐式转换,隐式转换如何使用?总结隐式转换实例用法
  4. kts 样例,包含多渠道打包。改名
  5. linux中dup2函数,Linux 下的 dup 和 dup2 函数简介
  6. 计算机二级web考试题库,2018年计算机二级考试WEB试题及答案一
  7. 深度补全(Sparsity Invariant CNNs)-论文阅读-翻译
  8. python能干嘛-python都能干什么用
  9. 电脑一般预装access吗_win7自带access数据库
  10. 【美少女】四面温柔攻,一人血书跟腾讯傲娇受组成cp可以吗?