1.下载cerbero工程
编译gstreamer可不是件容易事,一个是gst依赖了太多其他库,再一个是gst本身就有很多插件,这些插件分散在不同的工程里,相对来说ffmpeg就显得简单易用了不少,奈何项目里要用到gst,那就只能搞咯,幸运的是,github上有个开源项目,专为gst的交叉编译量身打造的,那就是cerbero项目。它只做两件事情,一个是配置编译环境,另一个是编译打包gst全部的相关工程,先从github上把它下下来
git clone https://github.com/GStreamer/cerbero.git
2.切换版本
刚下下来的cerbero工程默认编译最新的gst版本,如果你的项目需要其他的gst版本,那么直接切换cerbero的版本即可。
查看一下gst已经切换到对应的分支
3.配置编译环境
config目录下有不同平台的配置文件,根据需要选择对应的配置文件,然后执行命令
./cerbero-uninstalled -c config/cross-android-armv7.cbc bootstrap
这个命令会自动下载编译gst所需的依赖库,但事情往往没有这么简单,命令执行过程中总会出现一些问题,幸运的是大部分都是下载出错的,需要按出错提示逐个解决就行了
像上面这种纯粹就是下载超时了,本人的做法是直接手动执行它的下载命令,并把timeout改成20,然后就能下载下来了,再从新执行bootsrap
4.编译gst
当编译环境安装好之后,就可以编译gst了,执行以下命令
./cerbero-uninstalled -c config/cross-android-armv7.cbc package gstreamer-1.0
命令同样会自动下载gst的源码,也同样会出现一些奇怪的错误,需要根据具体错误提示解决,然后重新执行打包命令
像上面的错误,cerbero用python3写的,而本人的python环境没有six这个模块,需要自己安装,这个问度娘就行
还有这种cheksum errro的,感觉是下载的源有问题,本人也是没办法,只能重试几次,然后居然就好了
然后还有git fetch error的,这种一般是git的缓存不够引起的,解决方法是cd到对应的下载目录,执行git config
http.postBuffer 524288000,把缓冲加大到500M,再不行就加大到1G,然后手动执行git fetch --all
顺利编译通过后,可以看到cerbero工程目录里生成了两个包
5.打包gstream_android.so
解压编译生成的tar包(不带runtime那个),把解压后的路径导出到环境变量
export GSTREAMER_ROOT_ANDROID=你的解压目录
下载NDK,在NDK目录下新建jni目录,然后在jni目录里新建Application.mk和Andriod.mk文件,Android.mk将决定so库包含哪些编解码器插件,这里就不给出来了,可以这篇文章:
在NDK目录下,执行./ndk-build,打包so,如无意外,可以发现so静静地躺在了libs目录中
Tips
cerbero每次编译都会下载新的代码,如果想要修改源码做一些diy怎么办,只要修改cerbero/build/recipe.py这个脚本
把fetch和extract注释掉,这样编译时就不会下载代码了(下载解压后的源码在cerbero/build/sources/目录里)
执行以下命令可以只编译某个模块
./cerbero-uninstalled -c config/cross-android-armv7.cbc buildone gst-plugins-bad-1.0