Android App调用MediaRecorder实现录音功能的实例
MediaRecorder
Android的MediaRecorder包含了Audio和video的记录功能,在Android的界面上,Music和Video两个应用程序都是调用MediaRecorder实现的。
MediaRecorder在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaRecorder程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。
以开源的Android为例MediaRecorder的代码主要在以下的目录中:
JAVA程序的路径:
packages/apps/Camera/src/com/android/camera/VideoCamera.java
JAVAFramework的路径:
frameworks/base/media/java/android/media/MediaRecorder.java
JAVA本地调用部分(JNI):
frameworks/base/media/jni/android_media_MediaRecorder.cpp
这部分内容编译成为目标是libmedia_jni.so。
主要的头文件在以下的目录中:
frameworks/base/include/media/
多媒体底层库在以下的目录中:
frameworks/base/media/libmedia/
这部分的内容被编译成库libmedia.so。
多媒体服务部分:
frameworks/base/media/libmediaplayerservice/
MediaRecorder和MeidaPlayer使用相同的服务。
基于OpenCore部分
external/opencore/android/author
这部分内容被编译成库libopencoreauthor.so。
基本的录音功能实现:
好了,了解了大概的路径,具体的调用MediaRecorder的内容便可以深入各文件中去研究,接下来我们便直接来看例子,这个录音器的代码实现的说明都写在了注释中,非常简单:
importjava.io.IOException; importandroid.app.Activity; importandroid.media.MediaRecorder; importandroid.os.Bundle; /** *@description对通过android系统手机进行录音的一点说明测试 *@authorchenzheng_java *@since2011/03/23 */ publicclassMediaRecordActivityextendsActivity{ MediaRecordermediaRecorder; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); mediaRecorder=newMediaRecorder(); record(); } /** *开始录制 */ privatevoidrecord(){ /** *mediaRecorder.setAudioSource设置声音来源。 *MediaRecorder.AudioSource这个内部类详细的介绍了声音来源。 *该类中有许多音频来源,不过最主要使用的还是手机上的麦克风,MediaRecorder.AudioSource.MIC */ mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); /** *mediaRecorder.setOutputFormat代表输出文件的格式。该语句必须在setAudioSource之后,在prepare之前。 *OutputFormat内部类,定义了音频输出的格式,主要包含MPEG_4、THREE_GPP、RAW_AMR……等。 */ mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); /** *mediaRecorder.setAddioEncoder()方法可以设置音频的编码 *AudioEncoder内部类详细定义了两种编码:AudioEncoder.DEFAULT、AudioEncoder.AMR_NB */ mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); /** *设置录音之后,保存音频文件的位置 */ mediaRecorder.setOutputFile("file:///sdcard/myvido/a.3pg"); /** *调用start开始录音之前,一定要调用prepare方法。 */ try{ mediaRecorder.prepare(); mediaRecorder.start(); }catch(IllegalStateExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } /*** *此外,还有和MediaRecorder有关的几个参数与方法,我们一起来看一下: *sampleRateInHz:音频的采样频率,每秒钟能够采样的次数,采样率越高,音质越高。 *给出的实例是44100、22050、11025但不限于这几个参数。例如要采集低质量的音频就可以使用4000、8000等低采样率 * *channelConfig:声道设置:android支持双声道立体声和单声道。MONO单声道,STEREO立体声 * *recorder.stop();停止录音 *recorder.reset();重置录音,会重置到setAudioSource这一步 *recorder.release();解除对录音资源的占用 */ }
这里,一定要注意一点,那就是如果我们想要录音的话,那么首先得添加录音权限到AndroidManiferst.xml中:
<uses-permissionandroid:name="android.permission.RECORD_AUDIO"></uses-permission>