最近在研究安卓系统给app开发者提供的标准Media相关的工具类,本人做了一些demo来测试这些工具的使用方法。
本demo包含若干apk源码,需要说明以下几点:
1. 构建方式
Makefile使用Android.mk,在安卓编译服务器下编译生成APK,未使用AndroidStudio下的graddle方式,有需要的自行转换。
2. 模块测试方式
2.1. 单模块测试
专注于某个模块的学习,尽可能排除其它工具类的干扰,如果太多模块融合在一起,耦合下不便于对问题的定位。
例如,测试视频编码(MediaCodec模块),指定了读本地yuv文件,输出裸码流方式到本地文件。
测试视频文件解析(MediaExtractor模块),指定了本地视频文件,输出为裸码流到本地文件。
2.2. 多模块协同测试
在了解了单个模块使用方法的基础上,将各个模块串联起来使用,即pipeline方式串联各模块。
例如,MediaCodec(encoder) -> MediaMuxer
MediaExtractor -> MediaCodec(decoder) -> local_file
MediaExtractor -> MediaCodec(decoder) -> Render(audio/video)
MediaExtractor -> MediaMuxer
Camera -> MediaCodec -> MediaMuxer
local_file -> MediaCodec -> MediaMuxer
2.3. 如上测试方式说明
秉承由简单到复杂、由点到面、循序渐进的原则,按上面的方式展开开发测试。
github仓库的demo,有些是Media工具类相关的,有些是Android基础工具相关的。Media相关的demo还在陆续开发验证中。
另外,本人不想将程序写的太长(容错性做的不够,可能出现crash),基本上就一个java文件代码行数控制在一百行内搞定,恐担心太长时给人造成阅读的心理压力。
3. 标准的重要性
对于APK开发者来说,熟悉Android系统提供的标准API是如此的重要。对于做多媒体应用开发,熟悉frameworks/base/media/java/android/media/目录下的工具类,
可以非常方便、快速地进行应用程序开发,这正如在native层开发一些中间件系统,必须依赖bionic的标准库实现。
如果不借助于这些工具,你去重新造轮子,那么你的应用程序开发周期会非常之长。
例如,你的目标是做个播放器,如果借助MediaPlayer这个类,几十行代码就可以迅速搞定。
Android系统的一个很大特点是简单易用,把具体实现隐藏起来,抽象出几个接口给上层开发人员使用,会让你产生“开发个播放器这么容易啊!”的错觉!
其实,如果你去研究native层是如何实现视频播放,你会看到其实现是非常的冗长、繁琐、复杂,代码量遮天蔽日,理清各模块关系和层次性,需要花费大量时间。