Android中间层分析2.【media】Android 音视频播放流程-2.nuplayer的启动

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<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> 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<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> 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);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沈万三djh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值