Android JB MediaPlayerService Interface Analysis
2013-09-18 11:18
441 查看
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 的理解就显得至关重要. 待进一步挖掘分析.
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 的理解就显得至关重要. 待进一步挖掘分析.
相关文章推荐
- Android JB MediaPlayer MediaPlayerService Binder 构建 分析
- android开发之MediaPlayer+Service MP3播放器
- Android开发之MediaPlayerService服务详解(一)
- Android Binder机制浅析之注册MediaPlayerService(2)
- Android多媒体之MediaPlayerService
- android mediaplayer and mediaplayerservice的小说明
- Android学习(六)getService(String16(media.player))
- Android下MediaPlayerService构架介绍
- Android Binder机制浅析之注册MediaPlayerService(1)
- android开发之MediaPlayer+Service MP3播放器
- [置顶] Android开发之MediaPlayerService服务详解(一)
- android 媒体框架学习--mediaplayerservice 关系类图
- Android 音乐播放器Service+MediaPlayer
- Android MediaPlayer 分析- MediaPlayerService.cpp
- android开发之MediaPlayer+Service MP3播放器
- Android MediaPlayerService解析
- android MediaPlayer 简易播放器的实现 及类似斗地主音频池实现
- Android - SurfaceView + MediaPlayer实现分段视频无缝播放
- Windows Media Player Application Sample Code Analysis (Mobile 6.5.3)