zt: Android的MediaRecorder架構(gòu)介紹 - masterfish的個人空間 - 電玩俱樂部 PS3-XBOX360-Wii-PSP-NDSL-網(wǎng)游-紙客帝國-趣味第一 TGFC - powered by X-Space
第一部分 MediaRecorder概述
Android的MediaRecorder包含了Audio和video的記錄功能,在Android的界面上,Music和Video兩個應(yīng)用程序都是調(diào)用MediaRecorder實(shí)現(xiàn)的。
MediaRecorder在底層是基于OpenCore(PacketVideo)的庫實(shí)現(xiàn)的,為了構(gòu)建一個MediaRecorder程序,上層還包含了進(jìn)程間通訊等內(nèi)容,這種進(jìn)程間通訊的基礎(chǔ)是Android基本庫中的Binder機(jī)制。
以開源的Android為例MediaRecorder的代碼主要在以下的目錄中:
JAVA程序的路徑:
packages/apps/Camera/src/com/android/camera/VideoCamera.java
JAVA Framework的路徑:
frameworks/base/media/java/android/media/MediaRecorder.java
JAVA本地調(diào)用部分(JNI):
frameworks/base/media/jni/android_media_MediaRecorder.cpp
這部分內(nèi)容編譯成為目標(biāo)是libmedia_jni.so。
主要的頭文件在以下的目錄中:
frameworks/base/include/media/
多媒體底層庫在以下的目錄中:
frameworks/base/media/libmedia/
這部分的內(nèi)容被編譯成庫libmedia.so。
多媒體服務(wù)部分:
frameworks/base/media/libmediaplayerservice/
MediaRecorder和MeidaPlayer使用相同的服務(wù)。
基于OpenCore部分
external/opencore/android/author
這部分內(nèi)容被編譯成庫libopencoreauthor.so。
第二部分 MediaRecorder的接口與架構(gòu)MediaRecorder的各個可以用下圖的表示:
下載 (52.41 KB)
2009-7-11 18:04
MediaRecorder部分的頭文件在frameworks/base/include/media/目錄中,這個目錄是和libmedia.so庫源文件的目錄frameworks/base/media/libmedia/相對應(yīng)的。主要的頭文件有以下幾個:
■mediarecorder.h :mediarecorder的上層接口
■IMediaRecorder.h:MediaRecorder的服務(wù)部分實(shí)現(xiàn)接口
■PVMediaRecorder.h :MediaRecorder的下層接口,由OpenCore實(shí)現(xiàn)
在這些頭文件MediaRecorder.h提供了對上層的接口,而其他的幾個頭文件都是提供一些接口類(即包含了純虛函數(shù)的類),這些接口類必須被實(shí)現(xiàn)類繼承才能夠使用。
整個MediaRecorder庫和調(diào)用的關(guān)系如下圖所示
下載 (93.42 KB)
2009-7-11 18:04
整個MediaRecorder在運(yùn)行的時候,可以大致上分成Client和Server兩個部分,它們分別在兩個進(jìn)程中運(yùn)行,它們之間使用Binder機(jī)制實(shí)現(xiàn)IPC通訊。
注意MediaRecorder中不需要使用callback,這點(diǎn)和MediaPlayer的架構(gòu)有一定的區(qū)別,因此并不需要一個MediaRecorderClient的類。
MediaRecorder C語言上層的接口在mediarecorder.h 中,定義一個MediaRecorder類:
- class MediaRecorder
- {
- public:
- MediaRecorder();
- ~MediaRecorder();
- status_tinitCheck();
- status_tsetCamera(const sp<ICamera> camera);
- status_tsetPreviewSurface(const sp<Surface> surface);
- status_tsetVideoSource(int vs);
- status_tsetAudioSource(int as);
- status_tsetOutputFormat(int of);
- status_tsetVideoEncoder(int ve);
- status_tsetAudioEncoder(int ae);
- status_tsetOutputFile(const char* path);
- status_tsetVideoSize(int width, int height);
- status_tsetVideoFrameRate(int frames_per_second);
- status_tprepare();
- status_tgetMaxAmplitude(int* max);
- status_tstart();
- status_tstop();
- status_treset();
- status_tinit();
- status_tclose();
- status_trelease();
- };
復(fù)制代碼
在meidarecorder的上層接口中,基本不涉及數(shù)據(jù)流的處理,但是需要設(shè)置兩個重要的部分,一個是輸入的設(shè)備ICamera,另一個是ICamera的預(yù)覽(preview)Surface: - status_tsetCamera(const sp<ICamera> camera);
- status_tsetPreviewSurface(const sp<Surface> surface);
復(fù)制代碼
這兩個類需要通過上層的接口設(shè)置,其中設(shè)置的Surface在下層的處理中也會被設(shè)置到ICamera的接口中,ICamera則作為這種meidarecorder視頻輸入的設(shè)備,在meidarecorder底層的實(shí)現(xiàn)中,通過這個Icamera獲取視頻流。
prepare(),start(),stop()和reset()等幾個函數(shù)用于設(shè)置控制媒體記錄的運(yùn)行。
另外的幾個接口用于設(shè)置音頻、視頻的輸入和格式,輸出的格式。 第三部分 PVAuthor的架構(gòu) PVAuthor是基于OpenCore的AuthorEngine的Android實(shí)現(xiàn), 代碼在以下路徑中:
external/opencore/android/author/
它實(shí)現(xiàn)的接口類是PVMediaRecorder.h,這個類基本上是一個封裝,它需要處理三個方面的內(nèi)容:
音頻的輸入環(huán)節(jié)(Audio Input)
視頻的輸入(Camera)
視頻的預(yù)覽(使用ISurface)
下載 (86.62 KB)
2009-7-11 18:04
其中實(shí)現(xiàn)PVMediaRecorder.h的類是 PVMediaRecorder.cpp,authordriver.h和authordriver.cpp是具體實(shí) 現(xiàn),android_audio_input.*和android_camera_input.*是兩個PvmiMIOControl的實(shí) 現(xiàn),PvmiMIOControl最終會構(gòu)建成一個Node.。它們是Active Source類型的Node,因此它們需要實(shí)現(xiàn)PvmiMediaTransfer::writeComplete()函數(shù)。
在AndroidCameraInput內(nèi)部會建立一個Camera(可以不使用從外部得到的方 式);AndroidCameraInput::SetPreviewSurface的函數(shù)用于得到一個外部的ISurface,這個Surface將被 設(shè)置到Camera中,作為Camera的預(yù)覽。
android_audio_input.*是作為音頻輸入的實(shí)現(xiàn),它基于Android的Audio系統(tǒng)構(gòu)建,主要使用media/AudioRecord.h接口。 第四部分 Android MediaRecorder和Camera的關(guān)系
從功能的角度MediaRecorder一般包含音頻,視頻記錄,視頻預(yù)覽的功能,Camera包含了取景區(qū)預(yù)覽,靜態(tài)圖像捕獲的功能。
在Android中,應(yīng)用程序自上而下分成JAVA應(yīng)用,JAVA框架,JNI,C框架,具體實(shí)現(xiàn)幾個部分。多媒體方面的程序尤其是這樣。
MediaRecorder和Camera在Android中都有自上而下的架構(gòu),它們在頂層JAVA應(yīng)用層,共用一個應(yīng)用程序Camera(其中的程序 也是獨(dú)立的),在JAVA框架和JNI層是獨(dú)立的,主要的聯(lián)系在于Camer的C框架以下的內(nèi)容被MediaRecorder實(shí)現(xiàn)(也就是 PVAuthor)所調(diào)用,作為MediaRecorder實(shí)現(xiàn)的視頻輸入設(shè)備,它的作用是負(fù)責(zé)傳輸視頻數(shù)據(jù)和提供顯示預(yù)覽。本身Camera C框架以下的代碼基本提供了取景器預(yù)覽(Preview)、視頻數(shù)據(jù)流獲取、靜止圖像獲取三方面的功能,MediaRecorder實(shí)現(xiàn)使用其取景器預(yù)覽 和視頻數(shù)據(jù)流獲取的功能,而Camera的JNI使用其取景器預(yù)覽和靜止圖像獲取兩方面的功能
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。