【Android 开发者】
Android的MediaRecorder架构介绍(三、四)
MediaRecorder的各个可以用下图的表示:
MediaRecorder部分的头文件在frameworks/base/include/media/目录中,这个目录是和libmedia.so库源文件的目录frameworks/base/media/libmedia/相对应的。主要的头文件有以下几个:
■mediarecorder.h :mediarecorder的上层接口
■IMediaRecorder.h:MediaRecorder的服务部分实现接口
■PVMediaRecorder.h :MediaRecorder的下层接口,由OpenCore实现
在这些头文件MediaRecorder.h提供了对上层的接口,而其他的几个头文件都是提供一些接口类(即包含了纯虚函数的类),这些接口类必须被实现类继承才能够使用。
整个MediaRecorder库和调用的关系如下图所示:
整个MediaRecorder在运行的时候,可以大致上分成Client和Server两个部分,它们分别在两个进程中运行,它们之间使用Binder机制实现IPC通讯。
注意MediaRecorder中不需要使用callback,这点和MediaPlayer的架构有一定的区别,因此并不需要一个MediaRecorderClient的类。
MediaRecorder C语言上层的接口在mediarecorder.h 中,定义一个MediaRecorder类:
class MediaRecorder
{
public:
MediaRecorder();
~MediaRecorder();
status_tinitCheck();
status_tsetCamera(const sp& camera);
status_tsetPreviewSurface(const sp& 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();
};
复制代码
在meidarecorder的上层接口中,基本不涉及数据流的处理,但是需要设置两个重要的部分,一个是输入的设备ICamera,另一个是ICamera的预览(preview)Surface:
status_tsetCamera(const sp& camera);
status_tsetPreviewSurface(const sp& surface);
复制代码
这两个类需要通过上层的接口设置,其中设置的Surface在下层的处理中也会被设置到ICamera的接口中,ICamera则作为这种meidarecorder视频输入的设备,在meidarecorder底层的实现中,通过这个Icamera获取视频流。
prepare(),start(),stop()和reset()等几个函数用于设置控制媒体记录的运行。
另外的几个接口用于设置音频、视频的输入和格式,输出的格式。