Android音视频处理流程,音视频启动|安卓音视频播放流程(基于Android7.0)|神农笔记…

  • Post author:
  • Post category:其他


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