`
crazier9527
  • 浏览: 1018422 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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来最终实现多媒体播放功能。

 

  • 大小: 31.4 KB
  • 大小: 34.7 KB
  • 大小: 26 KB
分享到:
评论

相关推荐

    Android的MediaPlayer架构介绍

    ### Android的MediaPlayer架构详细介绍 #### 一、MediaPlayer概述 Android平台上的`MediaPlayer`是一个非常重要的组件,用于处理音频和视频的播放任务。无论是系统自带的音乐播放器还是视频播放器应用,都依赖于`...

    Android的MediaPlayer架构介绍补充[归类].pdf

    在Android系统中,MediaPlayer是用于播放音频和视频的核心组件,其架构设计涉及到多个层次和组件交互,特别是跨进程通信(IPC)的部分。本篇将详细解释Android MediaPlayer架构中的Binder代理机制以及通过...

    Android的MediaPlayer架构介绍.pdf

    "Android 的 MediaPlayer 架构介绍" Android 的 MediaPlayer 架构是 Android 系统中非常重要的一部分,本文将对其架构进行详细的介绍。 MediaPlayer 的主要功能是播放音频和视频,提供了 Music 和 Video 两个应用...

    android的多媒体MediaPlayer架构介绍

    对Android的多媒体框架MediaPlayer和基于Opencore的PVplayerEngine之间的调用做了一个较详细的说明。

    Android MediaPlayer 自定义循环次数

    在Android开发中,MediaPlayer是处理音频和视频播放的核心类之一,它提供了丰富的API来控制多媒体文件的播放。本文将深入探讨如何使用MediaPlayer自定义循环播放的次数,这在需要重复播放特定音频片段的应用场景中...

    Android MediaPlayer使用方法简单介绍

    而`Android MediaPlayer使用方法简单介绍.docx`则可能是更详尽的教程,包含了更多实践中的注意事项和技巧。 最后,`3gp`格式的文件如"高清MV少女时代-Gee-原装画质MV640x360-MP4.3gp"、"蔡妍 只有你.3gp"、"Nobody...

    Android MediaPlayer播放mp3的实例.doc

    "Android MediaPlayer播放mp3的实例" Android 中的 MediaPlayer 是一个功能强大且复杂的媒体播放器,可以播放音频和视频文件。在 Android 的界面上,Music 和 Video 两个应用程序都是调用 MediaPlayer 实现的。...

    Android 使用MediaPlayer播放视频

    在博客"Android使用MediaPlayer播放视频"中,作者更详细地介绍了如何实现视频播放,包括网络视频播放、处理播放状态变化、控制播放进度等功能。通过阅读该博客,你可以获得更全面的了解和实践指导。 总之,`...

    android MediaPlayer播放视频网络URL,asset目录下文件,本地视频文件

    在Android开发中,`MediaPlayer`类是用于播放各种媒体文件的核心组件。它可以处理音频、视频流,支持多种格式,如MP3、AAC、MPEG-4等。在本教程中,我们将深入探讨如何使用`MediaPlayer`播放网络URL、Asset目录下的...

    android MediaPlayer+SurfaceView实现播放

    在Android开发中,多媒体播放是常见的功能之一,`MediaPlayer` 和 `SurfaceView` 的结合使用是实现视频播放的标准方式。本篇文章将详细讲解如何利用这两个组件来构建一个视频播放器。 首先,`MediaPlayer` 是...

    Android实例之MediaPlayer播放音乐和视频

    在Android开发中,MediaPlayer是一个非常重要的组件,它用于播放音频和视频文件。在这个"Android实例之MediaPlayer播放音乐和视频"中,我们将深入探讨如何利用MediaPlayer类实现多媒体的播放功能。 首先,...

    玩转 Android MediaPlayer之视频预加载(优化)

    在Android开发中,MediaPlayer是系统提供的一个核心组件,主要用于播放音频和视频文件。在处理视频播放时,预加载(Preloading)是一个非常重要的优化策略,它有助于提高用户体验,特别是对于网络视频流而言。预加载...

    Android应用开发mediaplayer播放音频,带有进度条

    在Android应用开发中,MediaPlayer类是用于播放各种音频和视频资源的核心组件。在这个特定的示例中,我们关注的是如何使用MediaPlayer与进度条(SeekBar)结合,创建一个简单的音频播放器。以下是对这个Android应用...

    Android MediaPlayer研究问题

    在Android开发中,MediaPlayer是一个非常重要的组件,它用于播放各种媒体资源,如音频和视频文件。这个组件在处理多媒体内容时提供了丰富的功能,但同时也伴随着一些常见问题和挑战。这篇博客"Android MediaPlayer...

    Android 中级教程之------Android MediaPlayer播放mp3的实例

    在Android开发中,MediaPlayer是一个非常重要的组件,它用于播放各种媒体资源,如音频和视频文件。本教程将深入探讨如何使用Android的MediaPlayer类来播放MP3格式的音频文件。了解这个知识点对于Android开发者来说至...

    Android MediaPlayer

    **Android MediaPlayer 深度解析** 在Android平台上,多媒体处理是一个重要的功能,而`MediaPlayer`类是Android SDK提供的一种核心组件,专门用于处理音频和视频的播放。它提供了丰富的功能,如播放本地或网络资源...

    Android MediaPlayer简单音乐播放器

    以下将详细介绍`MediaPlayer`的使用及其相关知识点。 1. **初始化MediaPlayer** 创建`MediaPlayer`对象时,首先需要通过`setDataSource()`方法指定要播放的音频文件路径。这可以是本地文件路径、网络URL或者资源ID...

    Android下MediaPlayer播放MP3示例

    在Android平台上,`MediaPlayer`是系统提供的一个核心组件,用于播放音频和视频文件。这个组件支持多种媒体格式,包括MP3。在这个示例中,我们将深入探讨如何使用`MediaPlayer`来播放MP3文件。 首先,我们需要了解`...

Global site tag (gtag.js) - Google Analytics