在Android中大量使用到了C/S架构来实现应用层和底层服务交互,而Binder机制无处不在。
同样MediaPlayer也使用了这种机制,MediaPlayer在运行的时候,同样可以分为Client/Server两个部分,他们分别在不同的进程中运行,不同进程间的通信使用Binder机制,架构图如下:
1)如果从功能角度看,最上层是java层MediaPlayer的API, 然后通过JNI层到C++层之间的IPC通信,最下边就是palyer的具体实现了(StageFrightPlayer,NuPlayer等等)
2)C++层是比较重要的环节,这一块也是C/S架构的核心,主要围绕C++层MediaPlayer通过BpMediaPlayerService这个proxy对象,经过IPC与远程服务端MediaPlayerService(BnMediaPlayerService)通信,完成C/S架构。(Bpxxx是一个代理外包,所有真正的工作是再Bnxxx里面做的,这里p指proxy,n指native)
3)当Server端接受到Client端的请求,MediaPlayerService会为每一个Client进程创建一个会话,这里就是new一个MediaPlayer::Client对象与其交互,然后这个对象再根据Client端请求的资源类型去判断创建了什么类型的Player,就是最下面那些。(最下面这些Player很多都是芯片厂商自己做的,每家做的都不一样)