NuPlayer 安卓原生的Player , 用于替代Awesomeplayer ;
1 结构关系图
MediaPlayerFactory 通过工厂模式创建AwesomePlayer , NuPlayer,其他Player.
问:具体创建哪个Player 如何选择?
答:通过打分机制,选择得分最高的。
MediaPlayerService::Client::setDataSource()
>MediaPlayerFactory::getPlayerType()
>>GET_PLAYER_TYPE_IMPL() //这是个宏函数
>>> v->scoreFactory() //这里会遍历所有注册player 的分数 ,然后选最高的那个
每个player 都有实现自己的sorceFactory() 函数。 已Nuplayer 来说,位置再:
class NuplayerFactory : public MediaPlayerFactory :: IFactory 中
2 NuPlayer 层次关系
3 Nuplayer 解码模块
Nuplayer 解码引入了NuplayerDecodeBase, 这是个基类。 真正解码逻辑再NuPlayerDecoder.cpp 文件中。
解码器创建流程:
NuPlayer::instantiateDecoder()
> *decoder->configure(format)
>> NuPlayer::Decoder::onConfigure()
>>>MediaCodec::CreateByType()
>>>mcodec->configure() //构建解码器
>>>mcodec->start()
4 NuPlayer Render
代码逻辑位于NuPlayerRenderer.c 中
1 解码后的音视频数据在哪里缓存?
答:再NuPlayerRenderer.c 文件中有个QueueEntry 的队列, 声明如下两个变量:
List<QueueEntry> mAudioQueue; //音频缓存队列
List<QueueEntry> mVideoQueue; //视频缓存队列
通过NuPlayer::Renderer::onQueueBuffer() // 将数据推进队列中;
2 解码后的音视频数据如何进行render?
再Nuplayer::Renderer::onDrainAudioQueue() 中消耗Audio数据;
postDrainVideoQueue()中会做AVSYNC, 之后会Call到NuPlayer::Renderer::OnDrainVideoQueue() 中消耗Video 数据,