2.1启动
上一章简介中讲到,Android7.0 在多媒体服务拆分成了多个进程,不在是以前的单个mediaserver进程。具体如下
mediaserver
media.codec
media.extractor
audioserver 这些进程是管理那些服务,和那些进程相关联。我们一个个来看。
2.1.1 mediaserver进程的启动
我们直接来看下main_mediaserver.cpp文件
[-->main_mediaserver.cpp]
int main(int argc __unused, char **argv __unused)
{
...
MediaPlayerService::instantiate();
...
}
和大多数服务一样,调用instantiate()进行初始化。和7.0以前不一样,在我们直接来看下main_mediaserver只启动了MediaPlayerService。
[-->MediaPlayerService.cpp]
void MediaPlayerService::instantiate() {
defaultServiceManager()->addService(
String16("media.player"), new MediaPlayerService());
}
MediaPlayerService::MediaPlayerService()
{
...
MediaPlayerFactory::registerBuiltinFactories();
}
如上将创建个MediaPlayerService对象加入ServiceManager中,设置的名字是media.player,方便其他服务调用。在MediaPlayerService构造函数中,重点关注下 MediaPlayerFactory::registerBuiltinFactories;
[-->MediaPlayerFactory.cpp]
void MediaPlayerFactory::registerBuiltinFactories() {
...
registerFactory_l(new NuPlayerFactory(), NU_PLAYER);
registerFactory_l(new TestPlayerFactory(), TEST_PLAYER);
...
}
status_t MediaPlayerFactory::registerFactory_l(IFactory* factory,
player_type type) {
...
if (sFactoryMap.add(type, factory) < 0) {
ALOGE("Failed to register MediaPlayerFactory of type %d, failed to add"
" to map.", type);
return UNKNOWN_ERROR;
}
return OK;
}
这里讲几个PlayerFactory的对象注册的列表中,这里面只给出了两个,还可能有多个,比如一些厂商自己的写的FFPlayer,或者自己实现的一些Player等,都需要在这里注册。
后期上层创建MediaPlayer的时候可以有选择的使用这些player。
2.1.2 media.codec进程的启动
[-->main_extractorservice.cpp]
int main(int argc __unused, char** argv)
{
....
strcpy(argv[0], "media.extractor");
sp proc(ProcessState::self());
sp sm = defaultServiceManager();
MediaExtractorService::instantiate();
...
}
2.1.3 media.codec进程的启动
[-->main_codecservice.cpp]
int main(int argc __unused, char** argv)
{
...
strcpy(argv[0], "media.codec");
sp proc(ProcessState::self());
sp sm = defaultServiceManager();
MediaCodecService::instantiate();
...
}
2.1.4 audioserver 进程的启动
[-->main_audioserver.cpp]
int main(int argc __unused, char** argv)
{
AudioFlinger::instantiate();
AudioPolicyService::instantiate();
RadioService::instantiate();
SoundTriggerHwService::instantiate();
...
}
这个比较不一样 启动了 三个服务。
2.1.5 相关进程简介mediadrmserver cameraserver surfaceflinger
其实还有一些和音视频相关联的进程这里需要说明一下。
比如mediadrmserver 进程它是负责drm数据处理的。
cameraserver 我们说过了,它之前的服务和我们的mediaserver是一块的,现在分开了。
surfaceflinger 我们知道负责图像处理的,视频的图像输出依赖它。
难么这些服务都启动完成后接下来就是处理上层应用的播放流程,上层应用的播放流程我们按照以下接口分析:
MediaPlayer player = new MediaPlayer();
player.setDataSource("/sdcard/test.mp4");
player.setSurface(surface);
player.prepare();
player.start();
1、将从上层java接口,一直到底层cpp接口。起中间调用所跨过的几个重要的部分如下:
-->MediaPlayer.java
-->android_media_mediaplayer.cpp
-->mediaplayer.cpp
-->MediaPlayerService.cpp
-->NuplayerDriver.cpp
-->Nuplayer.cpp
2、分析这些接口我们抓住数据流的输入和输出。 一个mp4 进去,
是怎么把mp4 里面的音频数据和视频数据分离出来的。
分离出来的数据是怎么输出到设备的(音频设备对应的是AudioTrack,视频设备对应的是Surface);