MediaPlayer,Camera

来源:互联网 发布:tv007网络电视下载 编辑:程序博客网 时间:2024/06/05 03:18

MediaPlayer vs Camera(1)

MediaPlayerCamera都采用client/sever的架构,都由3binder/bpbinder组成。

1. MediaPlayer架构

图片

2. 3Bpbinder/Binder

(1) MediaPlayer(c++)BpMediaPlayerClient

它们都实现了IMediaPlayerClient 接口,用于将底层播放时的一些事件通知到上层,BpMediaPlayerClientClient的成员。

(2) BpMediaPlayerClient

实现了IMediaPlayer接口,BpMediaPlayer将播放的api(prepare,setdatasource,start)发送给ClientBpMediaPlayerMediaPlayer的成员,ClientMediaPlayerService的成员。

(3) BpMediaPlayerServiceMediaPlayerService

主要是建立BpMediaPlayerClient之间的连接。

3. 创建一个MediaPlayer的流程

(1) MediaPlayer.java

public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder) {

try {

MediaPlayer mp = new MediaPlayer();//构造函数中调用native_setup

mp.setDataSource(context, uri);//即调用c++ MediaPlayersetDataSource

if (holder != null) {

mp.setDisplay(holder);

}

mp.prepare();

return mp;

(2) android_media_MediaPlayer.cpp

static void

android_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this)

{

sp<MediaPlayer> mp = new MediaPlayer();//创建 BnMediaPlayerClient

// create new listener and give it to MediaPlayer

sp<JNIMediaPlayerListener> listener = new JNIMediaPlayerListener(env, thiz, weak_this);

mp->setListener(listener);

// Stow our new C++ MediaPlayer in an opaque field in the Java object.

setMediaPlayer(env, thiz, mp);//存放起来,以后通过getMediaPlayer获取

}

(3) mediaplayer.cpp

status_t MediaPlayer::setDataSource(int fd, int64_t offset, int64_t length)

{

const sp<IMediaPlayerService>& service(getMediaPlayerService());

if (service != 0) {//得到 BpMediaPlayerService

sp<IMediaPlayer> player(service->create(getpid(), this, fd, offset, length));//得到BpMediaPlayer,以后api调用即都是通过BpMediaPlayer来调

err = setDataSource(player);

}

return err;

}

(4) MediaPlayerService.cpp

sp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url)

{

sp<Client> c = new Client(this, pid, connId, client);

//创建Client,对应上面的 BpMediaPlayer,所有api调用都会传递给Client

if (NO_ERROR != c->setDataSource(url))//setDataSource会根据媒体类型创建不同的播放器,如PVPlayer,MiDiPlayer,StageFrightPlayer,具体的播放功能由他们实现

{

c.clear();

return c;

}

wp<Client> w = c;

Mutex::Autolock lock(mLock);

mClients.add(w);

return c;

}

原创粉丝点击