打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
android的mediaplayer架构介绍 补充
关键字: android的mediaplayer架构介绍 补充

(muddogxp Android开发者论坛原创,转载请注明) 

一.            类图扩充 






Binder代理,本地接口 
类图中加入了Bp<Interface>的代理类:BpMediaPlayer, BpMediaPlayerService。这些类和相应的Bn<Interface>互相配对,Bp<Interface>客户端代理接口,而Bn<Interface>实现服务端本地接口。 

拿BxMediaPlayer来举例:BpMediaPlayer继承BpInterface<IMediaPlayer>,并重载实现IMediaPlayer接口的所有方法,这些方法包括start(), stop(), pause()等等。在这些重载方法中,实现client<->server的服务协议,利用remote()->transact()发送请求ID(enum结构),请求附带数据并获得调用结果(reply)。然后由宏IMPLEMENT_META_INTERFACE(MediaPlayer, "android.hardware.IMediaPlayer”) 将BpMediaPlayer和静态方法IMediaPlayer::asInterface(const sp<IBinder>& obj)相关联。你在代码里看不到有代码去实例化BpMediaPlayer,其实是在asInterface里做的,并且由interface_cast模板函数实现: 






Template<typename INTERFACE> 
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj) 

    return INTERFACE::asInterface(obj); 




具体的interface_cast的用法,可以在BpMediaPlayerService::create()里看到: 

virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url) 
    { 
        Parcel data, reply; 
        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); 
        data.writeInt32(pid); 
        data.writeStrongBinder(client->asBinder()); 
        data.writeCString(url); 
        remote()->transact(CREATE_URL, data, &reply); 
        return interface_cast<IMediaPlayer>(reply.readStrongBinder()); 
    } 



该create函数,实际是mediaplayer client实例在请求MediaPlayerService获取一个MediaPlayer服务接口时,BpMediaPlayerService代理返回的interface_cast过后得到的BpMediaPlayer实例。 

因此,如果某个service需要走IPC层(也就是服务提供者和请求者不在同一个进程里),那么这个服务需要暴露的IXXXX Interface必然被BpXX/BnXX两个类实现(继承),Bp用在客户端,Bn用在服务端。客户端获取服务接口类的类型虽然是IXXXX,但实际上利用C++的多态机制,得到的是BpXX的类型。 

各个类之间关系 
MediaPlayer(MediaPlayerClient)对象从MediaPlayerService获取的player,实际上是BpMediaPlayer实例,并保存在它的mPlayer成员变量中。对应的在MediaPlayerService实例中,MediaPlayerClient申请,并创建的player对象会被放入clients成员向量中,该向量实际上是BnMediaPlayer的对象容器。每个client对象都有自己的mPlayer成员变量,保存的则是OpenCORE创建的PVPlayer对象。这里有两个mPlayer成员变量,各自代表不同类型,不要混淆。 



二.            通过MediaPlayer获得service player时序图 

以setDataSource接口为例: 







使用MediaPlayer的App,可以通过setDataSource来获得(创建)一个player对象,并保存在mPlayer成员中。大概的时序:MediaPlayer首先创建一个service代理对象BpMediaPlayerService,通过该代理对象的create()方法去call IPC,对MediaPlayerService发出创建player的请求。BnMediaPlayerService则在获取IPC的调用请求后,直接调用MediaPlayerService的create方法,分配一个Client对象,然后通过IPC返回该client对象的asBinder()的返回结果。BpMediaPlayerService在得到BnMediaPlayerService返回的client->asBinder()的reply后,会利用readStrongBinder()去读出IBinder对象,将其作为参数调用interface_cast创建一个BpMediaPlayer。(IBinder对象内部到底记录了些什么,目前还没研究:))得到了BpMediaPlayer的MediaPlayer对象,将其保存入mPlayer,之后App就可以调用其完成一些列操作。 



三.            使用service player时序图 









以上的时序图,描述的是之前获得的mPlayer的使用时序。这个时序比较简单,这里不做详细说明,需要注意的是图最右侧,Client对象实际要通过创建和调用OpenCORE里的PVPlayer来最终实现多媒体播放功能。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
对hanchao3的《Android的MediaPlayer架构介绍》的补充 - Linu...
android多媒体本地播放流程video playback--base on jellybean(1)
android的binder机制研究
Android的MediaPlayer架构介绍 - 狂徒的 - JavaEye技术网站
interface
Android多媒体开辟笔记【4】-- 上层mediaPlayer 是如何调到Stagefright的【2】【图解】
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服