Android MediaRecorder架构详解
本文主要詳解MediaRecorder架構(gòu),從上層調(diào)到StagefrightRecorder的流程以及應(yīng)用層錄音接口調(diào)用的流程。(注:本次分析基于android4.4.2源碼)
?
2.?應(yīng)用層錄音接口調(diào)用流程
(1)???? 調(diào)用new MediaRecorder()構(gòu)造函數(shù)得到實(shí)例。
(2)???? 調(diào)用setOutputFormat()設(shè)定媒體文件的輸出格式。
(3)???? 調(diào)用setAudioSource()設(shè)定音頻的錄入源以及調(diào)用setAudioEncoder()設(shè)定音頻的編碼方式。
(4)???? 調(diào)用setOutputFile()設(shè)定記錄的媒體文件保存的路徑。
(5)???? 調(diào)用prepare()準(zhǔn)備錄制。
(6)???? 調(diào)用start()開(kāi)始錄制。
(7)???? 記錄完成后,調(diào)用stop()停止錄制。
?
3.?應(yīng)用層調(diào)到StagefrightRecorder的流程
如圖1所示,MediaRecorder在運(yùn)行時(shí),可以分成Client和Server兩個(gè)部分,它們分別在兩個(gè)進(jìn)程中運(yùn)行,它們之間使用Binder機(jī)制實(shí)現(xiàn)IPC通訊。
??
?圖1 錄音從Java層調(diào)到StagefrightRecorder的流程圖
?
(1)?手機(jī)啟動(dòng)時(shí)會(huì)啟動(dòng)進(jìn)程/system/bin/mediaserver。該進(jìn)程會(huì)把media相關(guān)服務(wù)注冊(cè)到ServiceManager中,如MediaPlayerService。
(/frameworks/av/media/mediaserver/main_mediaserver.cpp)
?
?
?
?
?
?
(/frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp)
?
?
?
(2)應(yīng)用層創(chuàng)建MediaRecorder實(shí)例:mMediaRecorder = new MediaRecorder(); 調(diào)用SDK中MediaRecorder.java
(frameworks\base\media\java\android\media\MediaRecorder.java)
?
?
?
?
?
?
?
?
?
通過(guò)JNI方式調(diào)用到framework層android_media_MediaRecorder.cpp。
(\frameworks\base\media\jni\android_media_MediaRecorder.cpp)
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
(3)?繼而調(diào)用mediarecorder.cpp的構(gòu)造函數(shù),它首先會(huì)從ServiceManager中獲得MediaPlayerService服務(wù),然
后通過(guò)服務(wù)來(lái)創(chuàng)建recorder。這個(gè)recorder就是錄音的真實(shí)實(shí)例。
?(frameworks\av\media\libmedia\mediarecorder.cpp)
?
?
?
?
?
?
?
?
(4)?通過(guò)getMediaPlayerService得到的service其實(shí)是BpMediaPlayerService,它和mediaserver進(jìn)程中的BnMediaPlayerService是相對(duì)應(yīng)的,共同負(fù)責(zé)進(jìn)程間binder通信。BpMediaPlayerService中的createMediaRecorder其實(shí)是通過(guò)binder機(jī)制將CREATE_MEDIA_RECORDER消息發(fā)送出去。
(/frameworks/av/media/libmedia/IMediaPlayerService.cpp)
?
?
?
?
?
(5)在BnMediaPlayerService中,通過(guò)onTransact()來(lái)處理接收到的消息,并返回結(jié)果。當(dāng)接收消息中的code為CREATE_MEDIA_RECORDER時(shí),調(diào)用MediaPlayerService 中的createMediaRecorder函數(shù)。在該函數(shù)中創(chuàng)建了一個(gè)MediaRecorderClient的實(shí)例,也就是說(shuō)MediaPlayerService會(huì)為每個(gè)client應(yīng)用進(jìn)程創(chuàng)建一個(gè)相應(yīng)的MediaRecorderClient的實(shí)例,來(lái)提供服務(wù)。
(/frameworks/av/media/libmedia/IMediaPlayerService.cpp)
?
?
?
?
?
?
?
…
?
?
?
?
…
?
?
(/frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp)
?
?
?
?
(6)如此MediaRecorder.cpp就得到了一個(gè)recorder的實(shí)例,對(duì)它來(lái)說(shuō)這個(gè)實(shí)例和本地的其他類的實(shí)例沒(méi)什么用法上的區(qū)別,但其實(shí)這個(gè)實(shí)例是運(yùn)行在另外一個(gè)進(jìn)程中。實(shí)現(xiàn)這種假象的就是binder機(jī)制。在MediaRecorderClient的構(gòu)造函數(shù)中,才會(huì)真正的創(chuàng)建StagefrightRecorder的具體實(shí)例,即真正的錄制對(duì)象,使用的StageFright多媒體框架。在android 4.0以后只有StagefrightRecorder一個(gè)錄制框架。在2.2、2.3中還存在另外一個(gè)錄制對(duì)象PVMediaRecorder,使用的是OpenCore框架實(shí)現(xiàn)錄音或錄像。
(/frameworks/av/media/libmediaplayerservice/MediaRecorderClient.cpp)
?
?
?
?
圖2是錄音創(chuàng)建實(shí)例的時(shí)序圖
?
圖2 錄音創(chuàng)建實(shí)例的時(shí)序圖
?
4.?Application Framework層與libraries層錄音函數(shù)對(duì)應(yīng)關(guān)系
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setOutputFile(recordFile.getAbsolutePath());
mMediaRecorder.prepare();?
mMediaRecorder.start();
mMediaRecorder.stop();
mMediaRecorder.release();
?
sp<MediaRecorder> mr = new MediaRecorder();
mr->setAudioSource(1);? //MIC = 1
mr->setOutputFormat(0); //DEFAULT = 0;
mr->setAudioEncoder(0);//DEFAULT = 0;
mr->setOutputFile(fos.getFD(), 0, 0);
mr->prepare();
mr->start();
mr->stop();
mr->release();
?
5.?總結(jié)
通過(guò)對(duì)android mediarecorder架構(gòu)的詳解,了解各模塊調(diào)用的流程,不僅可以實(shí)現(xiàn)在應(yīng)用層調(diào)用錄音接口進(jìn)行錄音,還能直接調(diào)用libraries層錄音接口函數(shù)進(jìn)行C層錄音。同時(shí),若需要監(jiān)控錄音,則可以Hook系統(tǒng)進(jìn)程/system/bin/mediaserver的ioctl函數(shù),從而攔截該進(jìn)程的binder通信過(guò)程,通過(guò)解析binder通信數(shù)據(jù)包,就可以監(jiān)控到手機(jī)中所有錄音軟件的錄音行為。
?
6.?參考資料
[1]Android錄音MediaRecorder/AudioRecorder相關(guān)總結(jié):
http://www.360doc.com/content/12/0919/19/10764837_237084032.shtml
[2]MediaRecorder和AudioRecord的區(qū)別和聯(lián)系:
http://blog.csdn.net/ameyume/article/details/7885744
[3]MediaRecorder類介紹:http://blog.csdn.net/mark_dev/article/details/7249415
[4]AndroidXRef:http://androidxref.com/
原文地址:?http://www.isclab.org.cn/archives/2014/12/2946.html
總結(jié)
以上是生活随笔為你收集整理的Android MediaRecorder架构详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android 4.4 MediaRec
- 下一篇: Android mediaRecorde