MediaPlayer,Camera

本文详细解析了Android系统中MediaPlayer的架构设计,包括其client/server架构、关键组件如BpMediaPlayerClient和BpMediaPlayer的作用及交互方式,并阐述了创建MediaPlayer实例的具体流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值