日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android MediaRecorder架构详解

發(fā)布時(shí)間:2025/3/15 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android MediaRecorder架构详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.?簡(jiǎn)介 在android中錄制音頻有兩種方式,MediaRecorder和AudioRecord。兩者的區(qū)別如下: (1)?MediaRecorder 簡(jiǎn)單方便,不需要理會(huì)中間錄制過(guò)程,結(jié)束錄制后可以直接得到音頻文件進(jìn)行播放;錄制的音頻文件是經(jīng)過(guò)壓縮的,需要設(shè)置編碼器;錄制的音頻文件可以用系統(tǒng)自帶的播放器播放。 (2)?AudioRecorder 在聲音錄制過(guò)程中,可以處理采集的聲音數(shù)據(jù),如降噪、合成等。過(guò)程為一段一段進(jìn)行錄制然后得到數(shù)據(jù)分別進(jìn)行處理。錄制的是PCM格式的音頻文件,需要用AudioTrack來(lái)播放,AudioTrack更接近底層。

本文主要詳解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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。