1 库层(Native层)
1.1 MediaPlayer和MediaPlayerService
图表18MediaPlayer和MediaPlayerService
所以,MediaPlayerService和MediaPlayer之间是互为Bp,Bn的关系。MediaPlayer调用一个函数如getDuration实际上调的是MediaPlayerService create出来的一个player的getDuration,而这个player是一个MediaPlayerService的Client,它是一个BnMediaPlayer,然后加到mClients里。 所以MediaPlayer调用函数,会调用到MediaPlayerService的Client的同名函数。最终调用到Client里的变量mPlayer的同名函数。
从APP到AudioTrack
图表19创建stagefrightplayer的流程
图表20StagefrightPlayer上下文
playerType怎么拿的呢?从MediaPlayerFactory::getPlayerType(this, url)中拿来的,就是在sFactoryMap中拿得分最高的那个类型,sFactoryMap只在registerFactory_l被赋值,而MediaPlayerService构造函数中调用了registerBuiltinFactories,注册了几个Factory。
创建player(即Client里mPlayer)用到了简单工厂模式。有很多factory,这些factory创建了MediaPlayerBase,比如StagefrightPlayerFactory,new了一个player就是StagefrightPlayer(继承