天天看點

2011年Android MediaPlayer學習筆記之一2011年Android MediaPlayer學習筆記之一

一.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的目錄在:

二十.如何定義對外接口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<IMediaPlayerClient>

virtual status_t   onTransact( uint32_t code,

                              const Parcel& data,

                              Parcel* reply,

                              uint32_t flags = 0);

1. IMediaPlayerClient類繼承IInterface,

2.定義了一個MediaPlayer用戶端的接口,BnMediaPlayerClient繼承了BnInterface<IMediaPlayerClient>,這是為基于Android的基礎類Binder機制實作在程序通訊而建構的。事實上,根據BnInterface類模版的定義BnInterface<IMediaPlayerClient>類相當于雙繼承了BnInterface和ImediaPlayerClient。這是Android一種常用的定義方式。

二十一.對外接口類MediaPlayer

 mediaplayer.h是對外的接口類,它最主要是定義了一個MediaPlayer類:

class MediaPlayer : public BnMediaPlayerClient

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>& surface);

status_t setListener(const sp<MediaPlayerListener>& 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<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels);

static sp<IMemory> 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

DeathNotifier() {}

virtual ~DeathNotifier();

virtual void binderDied(const wp<IBinder>& who);

      事實上,MediaPlayer類正是間接地繼承了IBinder,而MediaPlayer:: DeathNotifier類繼承了IBinder:: DeathRecipient,這都是為了實作程序間通訊而建構的。

二十二.實作MediaPlayer功能的接口IMediaPlayer

   IMediaPlayer.h主要的的内容是一個實作MediaPlayer功能的接口,它的主要定義如下所示:

class IMediaPlayer: public IInterface

DECLARE_META_INTERFACE(MediaPlayer);

virtual void disconnect() = 0;

virtual status_t setVideoSurface(const sp<ISurface>& 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<IMediaPlayer>

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

DECLARE_META_INTERFACE(MediaPlayerService);

virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url) = 0;

virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, int fd, int64_t offset, int64_t length) = 0;

virtual sp<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels) = 0;

virtual sp<IMemory> decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels) = 0;

class BnMediaPlayerService: public BnInterface<IMediaPlayerService>

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

繼續閱讀