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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android的视频播放流程可以简单分为以下几个步骤: 1.选择视频源:首先需要确定要播放的视频文件的位置,可以是本地文件、网络文件或者通过其他方式获取的视频数据。 2.创建MediaPlayer对象:使用MediaPlayer类,通过其构造方法创建一个MediaPlayer对象。MediaPlayer是Android中用于播放和控制音视频资源的主要类。 3.设置数据源:在MediaPlayer对象上调用setDataSource()方法,将视频源传递给MediaPlayer,告诉它要播放的是哪个视频文件。 4.准备MediaPlayer:使用prepare()或prepareAsync()方法来准备MediaPlayer。prepare()方法是同步的,会阻塞当前线程,等待MediaPlayer准备就绪;而prepareAsync()方法是异步的,不会阻塞线程,会在后台准备MediaPlayer。 5.设置显示界面:如果需要在界面上显示视频,需要先获取一个SurfaceView或TextureView,并将其传递给MediaPlayer的setSurface()方法,用于渲染视频。 6.开始播放:通过MediaPlayer的start()方法开始播放视频。此时,MediaPlayer会从数据源读取视频数据,解码并渲染到SurfaceView或TextureView上进行显示。 7.视频控制:可以通过调用MediaPlayer的其他方法,如pause()、stop()、seekTo()等,来控制视频的暂停、停止和进度跳转等操作。 8.释放资源:在不需要播放视频时,需要及时释放MediaPlayer的资源,可以调用release()方法来释放相关资源。 总的来说,Android的视频播放流程包括选择视频源、创建MediaPlayer对象、设置数据源、准备MediaPlayer、设置显示界面、开始播放、视频控制和释放资源等步骤。根据具体需求,可以根据这个基本流程进行扩展和定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值