本文主要分析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& service(getMediaPlayerService());
if (service != NULL) {
mMediaRecorder = service->createMediaRecorder(getpid());
}
2.