
AndroidMediaRecorder架构详解
1.简介
在android中录制音频有两种方式,MediaRecorder和AudioRecord。两者的区别如下:
(1)MediaRecorder
简单方便,不需要理会中间录制过程,结束录制后可以直接得到音频文件进行播放;录制的音频文件是经过压缩的,需要设置编码器;录制的音频文件可以用系统自带的播放器播放。
(2)AudioRecorder
在声音录制过程中,可以处理采集的声音数据,如降噪、合成等。过程为一段一段进行录制然后得到数据分别进行处理。录制的是PCM式的音频文件,需要用AudioTrack来播放,AudioTrack更接近底层。stagefrightrecorder
本文主要详解MediaRecorder架构,从上层调到StagefrightRecorder的流程以及应用层录音接口调用的流程。(注:本次分析基于android4.4.2源码)
2.应用层录音接口调用流程
(1)调用new MediaRecorder()构造函数得到实例。
(2)调用setOutputFormat()设定媒体文件的输出式。
(3)调用setAudioSource()设定音频的录入源以及调用setAudioEncoder()设定音频的编码方式。
(4)调用setOutputFile()设定记录的媒体文件保存的路径。
(5)调用prepare()准备录制。
(6)调用start()开始录制。stagefrightrecorder
(7)记录完成后,调用stop()停止录制。
3.应用层调到StagefrightRecorder的流程
如图1所示,MediaRecorder在运行时,可以分成Client和Server两个部分,它们分别在两个进程中运行,它们之间使用Binder机制实现IPC通讯。

图1 录音从Java层调到StagefrightRecorder的流程图
(1)手机启动时会启动进程/system/bin/mediaserver。该进程会把media相关服务注册到ServiceManager中,如MediaPlayerService。
(/frameworks/av/media/mediaserver/main_mediaserver.cpp)
124 sp<ProcessState> proc(ProcessState::self());
125 sp<IServiceManager> sm = defaultServiceManager();
126 ALOGI("ServiceManager: %p", sm.get());
127 AudioFlinger::instantiate();
128 MediaPlayerService::instantiate();
129 CameraService::instantiate();
130 AudioPolicyService::instantiate();
131 registerExtensions();
132 ProcessState::self()->startThreadPool();
133 IPCThreadState::self()->joinThreadPool();
(/frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-50205-1.html
很有可比性