最近在研究安卓系统给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层是如何实现视频播放,你会看到其实现是非常的冗长、繁琐、复杂,代码量遮天蔽日,理清各模块关系和层次性,需要花费大量时间。