一.MediaPlay實現什麼主要功能?
1.Audio的播放;
2.Video的播放;

二.在Android界面上,哪些應用程序調用了MediaPlayer實現
1.Music;
2.Video;

三.MediaPlayer是底層是基於什麼庫實現的?
OpenCore(PacketVideo)

四.Application 原代碼路徑:
Packages/apps/Music/src/com/android/music
五. Framework的路徑是什麼?
frameworks/base/media/java/android/media/MediaPlayer.java
六.JAVA本地調用部分(JNI)
frameworks/base/media/jni/android_media_MediaPlayer.cpp
該代碼編譯成:libmedia_jni.so

七.多媒體Service
frameworks/base/media/libmediaplyerservice
文件有:
1.mediaplayerservice.h;
2.mediaplayerservice.cpp;
該代碼編譯成:libmediaplayerservice.so

八.基於OpenCore的多媒體播放
external/opencore
該代碼編譯成:libopencoreplayer.so

九.多媒體底層庫
frameworks/base/media/libmedia
該代碼編譯成:libmedia.so

十.在Framework裡的主要的頭文件
frameworks/base/include/media

十一.4大動態連結庫
1.libmedia_jni.so;
2.libmedia.so;
3.libmediaplayerservice.so;
4.libopencoreplayer.so;

十二.如何定義MediaPlayer的接口和架構
1.IMediaPlayerService.h;
2.IMediaPalyerClient.h;
3.MediaPlayer.h;


十三 .哪些文件實現MediaPlayer的架構
1.MediaPlayerService.cpp;
2.mediaplayer.cpp;


十四.MediaPlayer具體功能如何實現
1.通過PVPlayer(libopencoreplayer.so)實現;
2.實現 android.media.MediaPlayer類;

十五.libmedia_jni.so的作用
通過調用MediaPlayer類,來提供對JAVA的接口;

十六.libmedia.so的作用
1.實現MediaPlayer類,該類對上層提供接口;
2.進程間通訊,即與libmediaplayerservice.so通訊;

十七.MediaPlayer類接口是如何實現
在libmedia.so中實現;

十八.誰來實現Media的服務器功能
1.libmediaplayerservice.so來實現;
2. libmediaplayerservice.so是Media的服務器;
3. libmediaplayerservice.so她通過繼承libmedia.so來實現服務器功能;



十九.哪個頭文件提供對上層的接口
1.mediaplayer.h;
2. mediaplayer.h的目錄在:
frameworks/base/include/media

二十.如何定義對外接口IMediaPlayerClient
IMediaPlayerClient.h用於描述一個MediaPlayer客戶端的接口,描述如下所示:
class IMediaPlayerClient: public IInterface
{
public:
DECLARE_META_INTERFACE(MediaPlayerClient);
virtual void notify(int msg, int ext1, int ext2) = 0;
};

class BnMediaPlayerClient: public BnInterface
{
public:
virtual status_t onTransact( uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags = 0);
};
1. IMediaPlayerClient類繼承IInterface,
2.定義了一個MediaPlayer客戶端的接口,BnMediaPlayerClient繼承了BnInterface,這是為基於Android的基礎類Binder機制實現在進程通訊而構建的。事實上,根據BnInterface類模版的定義BnInterface類相當於雙繼承了BnInterface和ImediaPlayerClient。這是Android一種常用的定義方式。

二十一.對外接口類MediaPlayer
mediaplayer.h是對外的接口類,它最主要是定義了一個MediaPlayer類:
class MediaPlayer : public BnMediaPlayerClient
{
public:
MediaPlayer();
~MediaPlayer();
void onFirstRef();
void disconnect();
status_t setDataSource(const char *url);
status_t setDataSource(int fd, int64_t offset, int64_t length);
status_t setVideoSurface(const sp& surface);
status_t setListener(const sp& listener);
status_t prepare();
status_t prepareAsync();
status_t start();
status_t stop();
status_t pause();
bool isPlaying();
status_t getVideoWidth(int *w);
status_t getVideoHeight(int *h);
status_t seekTo(int msec);
status_t getCurrentPosition(int *msec);
status_t getDuration(int *msec);
status_t reset();
status_t setAudioStreamType(int type);
status_t setLooping(int loop);
status_t setVolume(float leftVolume, float rightVolume);
void notify(int msg, int ext1, int ext2);
static sp decode(const char* url, uint32_t *pSampleRate, int* pNumChannels);
static sp decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels);
//……
}
從接口中可以看出MediaPlayer類剛好實現了一個MediaPlayer的基本操作,例如播放(start)、停止(stop)、暫停(pause)等。
另外的一個類DeathNotifier在MediaPlayer類中定義,它繼承了IBinder類中的DeathRecipient類:
class DeathNotifier: public IBinder:: DeathRecipient
{
public:
DeathNotifier() {}
virtual ~DeathNotifier();
virtual void binderDied(const wp& who);
};
事實上,MediaPlayer類正是間接地繼承了IBinder,而MediaPlayer:: DeathNotifier類繼承了IBinder:: DeathRecipient,這都是為了實現進程間通訊而構建的。

二十二.實現MediaPlayer功能的接口IMediaPlayer
IMediaPlayer.h主要的的內容是一個實現MediaPlayer功能的接口,它的主要定義如下所示:
class IMediaPlayer: public IInterface
{
public:
DECLARE_META_INTERFACE(MediaPlayer);
virtual void disconnect() = 0;
virtual status_t setVideoSurface(const sp& surface) = 0;
virtual status_t prepareAsync() = 0;
virtual status_t start() = 0;
virtual status_t stop() = 0;
virtual status_t pause() = 0;
virtual status_t isPlaying(bool* state) = 0;
virtual status_t getVideoSize(int* w, int* h) = 0;
virtual status_t seekTo(int msec) = 0;
virtual status_t getCurrentPosition(int* msec) = 0;
virtual status_t getDuration(int* msec) = 0;
virtual status_t reset() = 0;
virtual status_t setAudioStreamType(int type) = 0;
virtual status_t setLooping(int loop) = 0;
virtual status_t setVolume(float leftVolume, float rightVolume) = 0;
};
class BnMediaPlayer: public BnInterface
{
public:
virtual status_t onTransact( uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags = 0);
};
在IMediaPlayer類中,主要定義MediaPlayer的功能接口,這個類必須被繼承才能夠使用。值得注意的是,這些接口和MediaPlayer類的接口有些類似,但是它們並沒有直接的關係。事實上,在MediaPlayer類的各種實現中,一般都會通過調用IMediaPlayer類的實現類來完成。

二十三.MediaPlayer服務的接口: IMediaPlayerService
IMediaPlayerService.h用於描述一個MediaPlayer的服務,定義方式如下所示:
class IMediaPlayerService: public IInterface
{
public:
DECLARE_META_INTERFACE(MediaPlayerService);
virtual sp create(pid_t pid, const sp& client, const char* url) = 0;
virtual sp create(pid_t pid, const sp& client, int fd, int64_t offset, int64_t length) = 0;
virtual sp decode(const char* url, uint32_t *pSampleRate, int* pNumChannels) = 0;
virtual sp decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels) = 0;
};
class BnMediaPlayerService: public BnInterface
{
public:
virtual status_t onTransact( uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags = 0);
};

REF://http://tieba.baidu.com/p/1342428441

由於具有純虛函數,IMediaPlayerService 以及BnMediaPlayerService必須被繼承實現才能夠使用,在IMediaPlayerService定義的create和decode等接口,事實上是必須被繼承者實現的內容。注意,create的返回值的類型是sp,這個IMediaPlayer正是提供實現功能的接口

BB 發表在 痞客邦 PIXNET 留言(0) 人氣()