录音与录像由MediaRecorder.java中提供的android.media.MediaRecorder类完成,应用程序可以调用该Java类提供的API进行录音录像的操作,包括指定录音源、录像源、
输出文件、音视频编码、视频尺寸、持续时间、声道数和采样率等。MediaRecorder调用方向,首先,最上层的应用程序调用 Java API类MediaRecorder,经过JNI层,调用到
C++类MediaRecorder;后者通过代理对象,即IMediaRecorder的子类对象,跨进程调用到MediaPlayerService中的MediaRecorderClient。在MediaPlayerService中会创建
MediaRecorderClient,MediaRecorderClient中会创建出StagefrightRecorder,最终是StagefrightRecorder完成音视频录制任务。
自Android2.3版本,开始使用StagefrightRecorder,以前版本使用PVRecorder。
Mediarecorder对应上层应用主要的API接口如下所示:
Public Method:
status_t initCheck();
status_t setCamera(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy);
status_t setPreviewSurface(const sp<Surface>& surface);
status_t setVideoSource(int vs);
status_t setAudioSource(int as);
status_t setOutputFormat(int of);
status_t setVideoEncoder(int ve);
status_t setAudioEncoder(int ae);
status_t setOutputFile(const char* path);
status_t setVideoSize(int width, int height);
status_t setVideoFrameRate(int frames_per_second);
status_t setParameters(const String8& params);
status_t setListener(const sp<MediaRecorderListener>& listener);
status_t prepare();
status_t getMaxAmplitude(int* max);
status_t start();
status_t stop();
status_t reset();
status_t init();
status_t close();
status_t release();
在meidarecorder的上层接口中,基本不涉及数据流的处理,但是需要设置两个重要的部分,一个是输入的设备ICamera,另一个是ICamera的预览(preview)Surface:
status_t setCamera(const sp& camera);
status_t setPreviewSurface(const sp& surface);
这两个类需要通过上层的接口设置,其中设置的Surface在下层的处理中也会被设置到ICamera的接口中,ICamera则作为这种mediarecorder视频输入的设备,在mediarecorder底层的实现中,通过这个Icamera获取视频流。
prepare(),start(),stop()和reset()等几个函数用于设置控制媒体记录的运行。另外的几个接口用于设置音频、视频的输入和格式,输出的格式。
MediaRecorder从调用关系来说一共分为6层调用,依次顺序表示为java apps -> java frameworks -> libmedia_jni.so-> libmedia.so -> libmediaplayerservice.so ->
libstagefrightrecorder.so。
未完待续~~