经过这篇文章了解c/c++编译器的基本使用,可以在后续移植第三方框架进行交叉编译时(编译android可用的库),清楚的了解应该传递什么参数,怎么传递参数给编译器,各个参数的意义是什么,从而为后面音视频的深刻学习编译ffmpeg作好准备工做。android
有关ffmpeg的编译资料网上一大推,可是照着资料拷贝的运行进行编译能顺利编译出静态库或静态库产物的寥寥无几。c++
笔者在学习的时候也是踩了不少的坑,确实是每次编译会诞生一个放弃的念头,缘由仍是本身的基础学得不够扎实。面试
由于ffmpeg和NDK都是在不断进行迭代的,好比说NDK在r18以后以后完全移除了gcc(包含r18版本),ffmpeg在4.o版本开始也针对Android平台的交叉编译默认使用clang编译,可是网上的不少资料都是使用gcc编译的。shell
因此若是要对照网上资料进行编译的话,保证NDK版本和ffmpeg版本甚至是编译环境工具都和做者的同样,这样会大大提升编译的成功率。小程序
在编译成功以后再不断尝试修改参数结合搜索资料尝试,力求弄清楚每一个参数的意义,作到举一反三。框架
本次编译使用的是mac苹果电脑,使用的NDK版本是r20,ffmpeg是从官网下载的最新版4.2.2。工具
从ffmpeg官网下载好源码解压后,进入源码目录,新建shell脚本文件,好比学习
脚本内容以下:ui
保存后运行脚本。spa
运行脚本的时候可能会遇到没有权限的问题,运行命令行增长一下执行权限后再次执行便可进行编译。
若是没有报错,大概几分钟后就能看编译成功:
编译成功
编译成功后在目标输出目录下会生成三个文件,如图:
编译成功后的目录
其中目录下是使用动态库或静态库时所须要的一些头文件;
目录存放着编译产物动态库或者静态库;
目录则存放一些简单的demo,咱们能够参照这些demo编写音视频的编解码等逻辑。
更多参数可在ffmpeg的源码目录下执行查看。
CFLAG参数这么长,怎么来的?其实这个不用死记,能够从AS NDK工程的.externativeBuild/cmake/debug/armeabi-v7a/build.ninja中拷贝,须要注意的是替换掉NDK的路径地址。
与网上gcc编译的脚本对比能够发现少了一些相似这样的参数,或许这就是clang的好处之一吧。