当应用层调用mediaplayer.start()的时候,在framework层对应的是在awesomeplayer中post一个mVideoEvent到TimedEventQueue中等待被调度。
当其被调度到的时候,会激活回调函数onVideoEvent。 在这个回调函数中,会做音视频的同步处理。代码很长捡关键的贴。 void AwesomePlayer::onVideoEvent() { for (;;) { ... status_t err = mVideoSource->read(&mVideoBuffer, &options); ... initRenderer_l(); ... mVideoRenderer->render(mVideoBuffer); } 在这个回调函数中可以看到这样一句话,status_t err = mVideoSource->read(&mVideoBuffer, &options);其中,mVideoBuffer 是一个MediaBuffer类型的成员变量。还记得mVideoSource是什么类型吗?这里的mVideoSource,就是前面返回的OMXCodec,那么实际调用是的: status_t OMXCodec::read(MediaBuffer **buffer, const ReadOptions *options),这个read函数会填充MediaBuffer *mVideoBuffer这个成员变量,然后交给Renderer来渲染输出。看看read函数的实现: status_t OMXCodec::read(MediaBuffer **buffer, const ReadOptions *options) { …... drainInputBuffers(); if (mState == EXECUTING) { fillOutputBuffers(); } } …... while (mState != ERROR && !mNoMoreOutputData && mFilledBuffers.empty()) { if ((err = waitForBufferFilled_l()) != OK) { return err; } } if (mState == ERROR) { return UNKNOWN_ERROR; } if(seeking) {