调用MediaPlayer的prepare方法后,经过一系列处理,最终后调用MediaPlayerService的prepareAsync方法,具体如下:
//frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
status_t MediaPlayerService::Client::prepareAsync()
{
ALOGV("[%d] prepareAsync", mConnId);
sp<MediaPlayerBase> p = getPlayer(); //取得Player
if (p == 0) return UNKNOWN_ERROR;
status_t ret = p->prepareAsync(); //调用MediaPlayerBase的prepareAsync方法
#if CALLBACK_ANTAGONIZER
ALOGD("start Antagonizer");
if (ret == NO_ERROR) mAntagonizer->start();
#endif
return ret;
}
调用MediaPlayerBase的prepareAsync方法,MediaPlayerBase是一个抽象类,MediaPlayerInterface继承于MediaPlayerBase,MediaPlayerInterface是一个接口,NuPlayerDriver继承与MediaPlayerInterface,因此调用MediaPlayerBase的prepareAsync方法,就是调用NuPlayerDriver的prepareAsync方法:
const sp<NuPlayer> mPlayer;
//frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
status_t NuPlayerDriver::prepareAsync() {
ALOGV("prepareAsync(%p)", this);
Mutex::Autolock autoLock(mLock);
switch (mState) {
case STATE_UNPREPARED:
mState = STATE_PREPARING;
mIsAsyncPrepare = true;
mPlayer->prepareAsync(); //调用NuPlayer的prepareAsync方法
return OK;
case STATE_STOPPED:
// this is really just paused. handle as seek to start
mAtEOS = false;
mState = STATE_STOPPED_AND_PREPARING;
mIsAsyncPrepare = true;
mPlayer->seekToAsync(0, MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC /* mode */,
true /* needNotify */); //调用NuPlayer的seekToAsync方法
return OK;
default:
return INVALID_OPERATION;
};
}
首先在每次MediaPlayer调用create创建的时候,会调用一次prepare,这个时候会走入NuPlayerDriver::prepareAsync中的STATE_UNPREPARED,之后会先调用stop一下,从而将NuPlayer播放器的状态切换为STATE_STOPPED态,之后再次调用prepare进入NuPlayerDriver::prepareAsync的STATE_STOPPED流程。
NuPlayer prepareAsync
调用NuPlayer的prepareAsync方法,我们继续在NuPlayer中分析:
NuPlayer::prepareAsync流程分析 | 知识管理 - PingCode
NuPlayer seekToAsync
调用NuPlayer的seekToAsync方法,我们继续在NuPlayer中分析: