MediaRecorder framework层的处理流程

本文主要分析framework层MediaRecorder.cpp文件对应的MediaRecorder类的处理流程。

MediaRecorder.cpp通过android_media_MediaRecorder.cpp JNI层与Java API类MediaRecorder.java相互关联。

下面通过对MediaRecorder类的几个主要函数进行分析来学习MediaRecorder的结构和处理流程。

1.MediaRecorder()构造函数

(1)首先通过getMediaPlayerService函数从ServiceManager中取得MediaPlayerService对象

MediaPlayerService对应的字符串标识是"media.player"。

顺便说一下,MediaPlayerService是在MediaPlayerService::instantiate()函数中注册到ServiceManager中的,最终是放在了Binder对象中。

void MediaPlayerService::instantiate() {
    defaultServiceManager()->addService(
            String16("media.player"), new MediaPlayerService());
}

(2)取得MediaPlayerService对象service后,通过createMediaRecorder(getpid())方法创建对应的MediaRecorder对象

createMediaRecorder函数的调用过程如下:

先调用BpMediaPlayerService类的createMediaRecorder函数,然后通过code CREATE_METADATA_RETRIEVER调用远程的实现。

在BnMediaPlayerService::onTransact中,当code为CREATE_MEDIA_RECORDER时,通过调用BnMediaPlayerService实现类的createMediaRecorder方法创建MediaRecorder,即调用MediaPlayerService::createMediaRecorder方法。MediaPlayerService类实现了BnMediaPlayerService抽象类。

(3)在MediaPlayerService::createMediaRecorder函数中,通过创建MediaRecorderClient对象,返回真正的MediaRecorder

在MediaRecorderClient构造函数中,创建了StagefrightRecorder对象,即真正的录制对象,使用的Stagefright多媒体框架。在4.0中只有StagefrightRecorder一个录制框架。

在2.2,2.3中还存在另外一个录制对象PVMediaRecorder,使用的是OpenCore框架实现录音或录像。

具体可以参考以前的一篇博客:MediaRecorderClient决定使用stagefright还是opencore实现录音录像的代码实现

至此,MediaRecorder构造函数就分析完了。

MediaRecorder构造函数的核心代码只有两句:

    const sp<IMediaPlayerService>& service(getMediaPlayerService());
    if (service != NULL) {
        mMediaRecorder = service->createMediaRecorder(getpid());
    }

2.

 

发布了270 篇原创文章 · 获赞 274 · 访问量 377万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览