2.1 Android NuPlayer流程 :进程启动

  • A+
所属分类:音视频

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);

 

 

2.0 Android NuPlayer流程简介
2.1 Android NuPlayer流程 —进程启动
2.2 Android NuPlayer流程—-MediaPlayer的创建
2.3 Android NuPlayer流程 -MediaPlayer的setDataSource流程
2.4 Android NuPlayer流程—-Nuplayer的工作原理
2.5 Android NuPlayer流程—-视频和音频的输出

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: