从事Android Media开发工作三年有余,刚从萌新变成菜鸟,一路上跌跌撞撞学习,看了很多零零碎碎的知识,为了加深对Android Media框架的理解,决定在这里记录下学习过程中想到的一些问题以及一些思考,也希望对初学Android并且有相同问题的同学有一些帮助。由于本人水平有限,笔记的内容可能会有一些错误,如果看到也恳请指出。
ps. 这里的Media框架指的是Android媒体播放器、音视频编解码相关的内容。
下面是我绘制的简单的Android Media框架图,主要包含有8个组成部分:
- Media Java API (MediaPlayer.java)
- Java API 用到的 JNI 方法以及本地服务的封装 (libmedia)
- 本地服务的实现MediaPlayerService (media.player)
- 本地player的实现 (NuPlayer)
- player依赖的相关服务 (media.extractors)
- player依赖的编解码框架 (libstagefright)
- libstagefright所依赖的vendor服务 (media.codec)
- 编解码组件框架 (OpenMax)
我们一起先了解一个问题:为什么Media框架中要使用服务,而不是动态链接或者静态链接调用呢?
我的理解是资源复用。比如说media.player这个service中会存储有MediaCodecList相关的信息,这个信息是通过加载/system/etc 或者/vendor/etc 中的xml文件获取的,使用服务我们可以只加载一次这些信息,就可以到处使用,而不是每次使用时单独去加载。当然还有其他原因,这里不做过多的叙述,等到了相关章节会再详细了解。
开始学习前还有一些前备知识需要了解,包括智能指针、异步消息机制、以及binder框架,这三部分穿插于Android Media框架的各个角落,先了解他们会对我们看代码有些许帮助。我在学习Media框架之前已经提前学习了这部分的内容,也做了一些笔记,这里也贴出来让有需要的同学看看。
- 智能指针
- 异步消息机制
- binder学习
对于binder的学习可以不用很深入(我也不太会,笔记记录的乱起八糟),了解如何使用即可。这里也贴一个我的学习demo,比较复杂一点,但是更加贴近实际的使用:
- binder demo
学习过程中贴的代码来自于aospxref.com:
- aospxref.com