Android JB MediaPlayerService Interface Analysis

        mediaplayerservice  作为android 提供多媒体服务的service, 其服务主要涉及playback, Recorder , metadataRetriever; 下面就来对mediaplayerservice一探究竟

  • mediaplayerservice  接口分析                          
1, MediaPlayerService::MediaPlayerService() 

      constructor 完成一件非常重要的事情,MediaPlayerFactory::registerBuiltinFactories();完成 MediaPlayerFactory的register, 之后才能使用  MediaPlayerFactory进行getPlayerType.


2, void MediaPlayerService::instantiate()

     defaultServiceManager()->addService(String16("media.player"), new MediaPlayerService());  通过ServiceManager add service,  之后就可以通过getService拿到BpMediaPlayerService.


3, sp<IMediaRecorder>  createMediaRecorder(pid_t pid)

     在其中进行sp<MediaRecorderClient> recorder = new MediaRecorderClient(this, pid);   MediaRecorderClient will   new StagefrightRecorder;  


4, sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid)

    在其中进行sp<MetadataRetrieverClient> retriever = new MetadataRetrieverClient(pid);    MetadataRetrieverClient 将进行具体的setDataSource, 进行getPlayerType, 进而extractMetadata.


5, sp<IMediaPlayer>  create(pid_t pid, const sp<IMediaPlayerClient>& client, int audioSessionId);  

   在其中进行sp<Client> c = new Client(this, pid, connId, client, audioSessionId,IPCThreadState::self()->getCallingUid());  playback 就以来于此client, 此client 负责管理具体的player.


6, sp<IMemory>  decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat);    

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

   此接口借助player, decoder 解一段data, 看一下流程, MediaPlayerFactory::getPlayerType ---> MediaPlayerFactory::createPlayer--->player.get())->setAudioSink ---->

  player->setDataSource----> player->prepareAsync() ----> player->start()-----> mem = new MemoryBase(cache->getHeap(), 0, cache->size()) 

   俨然一个player的简易工作流程已经出来.


7, sp<IOMX>  getOMX();              

    mOMX = new OMX;     非常重要,之后player进行OMXCodec::Create 将会用到它,用于管理OMXComponent.


  • class Client : public BnMediaPlayer 在mediaplayerservice中处于非常重要的位置,media playback 就靠它了,下面来分析一下它的interface.                                            

1,      MediaPlayerService::Client::setDataSource 

      此接口有三种不同的模式,分别是URL, FD, STREAM,  具体使用哪个要看对于mediaplayer中c++ API的使用,或者说看APK如何使用了,不过在mediaplay.jave中对URL进行了一些处理,will try to open url,  如果成功,那么将使用FD.

       首先会有player_type playerType = MediaPlayerFactory::getPlayerType的调用,在此就不得不说 MediaPlayerFactory  , 之前有提到在 MediaPlayerService的constructor中会register  MediaPlayerFactory , 在其中就会add 所以的player,  对于任何新加的player, 也将在此进行add, 如此在后续的处理中,才会命中相应的player;

        getPlayerType实际将由一个宏定义GET_PLAYER_TYPE_IMPL来完成对于player的select,    GET_PLAYER_TYPE_IMPL 将会遍历所有的register player, 按照约定的规则,使用scoreFactory进行打分,得分最高的player,也就是目标player, OK, get Player over.

        然后将call sp<MediaPlayerBase> p = setDataSource_pre(playerType), 在setDataSource_pre中完成createPlayer(playerType), 同时对于非hardwareOutput的audio , new AudioOutput(mAudioSessionId), 实为AudioTrack, 经AudinFlinger, HAL 输出audio.

        最后setDataSource_post(p, p->setDataSource(...));   首先会有一个p->setDataSource(...)   的调用,此处交给选定的player进行具体的setDataSource的操作, 之后记录mStatus, 然后是set the re-transmission endpoint if one was chosen.  

        至此, setDataSource 完成.

2,  MediaPlayerService::Client::prepareAsync 

     MediaPlayerService::Client::start()     

    MediaPlayerService::Client::pause()   等

    均是call 选择的player进行具体的工作.

3, MediaPlayerService::Client::setVideoSurfaceTexture

   对于video, 需要 setVideoSurfaceTexture, 同样call player p->setVideoSurfaceTexture(surfaceTexture) .     


  • mediaplayerservice内部有几个嵌套类,作一下分析                                                                                                                                                                                                                         

1, class AudioOutput : public MediaPlayerBase::AudioSink 

     包含成员变量AudioTrack*     mTrack;   

2,class AudioCache : public MediaPlayerBase::AudioSink

     在MediaPlayerService::decode 时候会用到new AudioCache,抓decoder之后的data.

3, class Client : public BnMediaPlayer 

    用于media playback, 前面已经分析.


简略分析了一下mediaplayerservice一些主要的接口, 欲给player增加一些新的功能,加深对mediaplayerservice 的理解就显得至关重要.     待进一步挖掘分析.                                        

发布了25 篇原创文章 · 获赞 0 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章