使用MediaRecoder实现简单的声音录制
首先需要添加两个权限
实例化MediaRecoder对象
mRecorder = new MediaRecorder(); // 设置声音源,参数表示声音来自麦克风 mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置所录制的声音文件格式 mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 设置录音输出文件位置 mRecorder.setOutputFile(mFilePath); // 设置录音编码格式 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // 设置录制的音频通道数,在prepare方法前调用 mRecorder.setAudioChannels(1); // 在设置完录音配置后,调用进入准备状态 mRecorder.prepare(); // 开始录制,并肩编码后的数据输出到所设置的输出文件中 mRecorder.start(); // 停止录制,在start后调用,如果需要再次调用start之前,重新配置MediaRecoder对象 mRecorder.stop(); // 释放所有资源 mRecorder.release();
与MediaPlayer类非常相似MediaRecorder也有它自己的状态图。下面是关于MediaRecorder的各个状态的介绍:
Initial:初始状态,当使用new()方法创建一个MediaRecorder对象或者调用了reset()方法时,该MediaRecorder对象处于Initial状态。在设定视频源或者音频源之后将转换为Initialized状态。另外,在除Released状态外的其它状态通过调用reset()方法都可以使MediaRecorder进入该状态。
Initialized:已初始化状态,可以通过在Initial状态调用setAudioSource()或setVideoSource()方法进入该状态。在这个状态可以通过setOutputFormat()方法设置输出格式,此时MediaRecorder转换为DataSourceConfigured状态。另外,通过reset()方法进入Initial状态。
DataSourceConfigured:数据源配置状态,这期间可以设定编码方式、输出文件、屏幕旋转、预览显示等等。可以在Initialized状态通过setOutputFormat()方法进入该状态。另外,可以通过reset()方法回到Initial状态,或者通过prepare()方法到达Prepared状态。
Prepared:就绪状态,在DataSourceConfigured状态通过prepare()方法进入该状态。在这个状态可以通过start()进入录制状态。另外,可以通过reset()方法回到Initialized状态。
Recording:录制状态,可以在Prepared状态通过调用start()方法进入该状态。另外,它可以通过stop()方法或reset()方法回到Initial状态。
Released:释放状态(官方文档给出的词叫做Idle state 空闲状态),可以通过在Initial状态调用release()方法来进入这个状态,这时将会释放所有和MediaRecorder对象绑定的资源。
Error:错误状态,当错误发生的时候进入这个状态,它可以通过reset()方法进入Initial状态。
提示:与MediaPlayer相似使用MediaRecorder录音录像时需要严格遵守状态图说明中的函数调用先后顺序,在不同的状态调用不同的函数,否则会出现异常。
MediaRecoder类方法:
getAudioSourceMax()
获取音频源的最大值。
int
getMaxAmplitude()
获取在前一次调用此方法之后录音中出现的最大振幅。
void
prepare()
准备录制。
void
release()
释放资源。
void
reset()
将MediaRecorder设为空闲状态,即Initial状态。
void
setAudioChannels(int numChannels)
设置录制的音频通道数。
void
setAudioEncoder(int audio_encoder)
设置所录制的声音的编码格式。
void
setAudioEncodingBitRate(int bitRate)
设置所录制的声音的编码位率。
void
setAudioSamplingRate(int samplingRate)
设置所录制的声音的采样率。
void
setAudioSource(int audio_source)
设置声音来源,一般传入 MediaRecorder. AudioSource.MIC参数指定录制来自麦克风的声音。
void
setCamera(Camera c)
设置一个摄像头用于录制。
void
setCaptureRate(double fps)
设置视频帧捕获率。
void
setLocation(float latitude, float longitude)
设置并存储在输出文件中的地理数据(经度和纬度)。
void
setMaxDuration(int max_duration_ms)
设置录制会话的最长持续时间(以ms为单位)。
void
setMaxFileSize(long max_filesize_bytes)
设置录制文件的最大文件大小。
void
setOnErrorListener(MediaRecorder.OnErrorListener l)
注册一个用于记录录制时出现的错误的监听器。
void
setOnInfoListener(MediaRecorder.OnInfoListener listener)
注册一个用于记录录制时出现的信息事件。
void
setOrientationHint(int degrees)
设置输出的视频播放的方向提示。
void
setOutputFile(FileDescriptor fd)
设置录制的音频文件的保存位置。
void
setOutputFile(String path)
设置录制的音频文件的保存位置。
void
setOutputFormat(int output_format)
设置所录制的音视频文件的格式。
void
setPreviewDisplay(Surface sv)
设置使用哪个SurfaceView来显示视频预览。
void
setProfile(CamcorderProfile profile)
指定CamcorderProfile对象。
void
setVideoEncoder(int video_encoder)
设置所录制视频的编码格式。
void
setVideoEncodingBitRate(int bitRate)
设置所录制视频的编码位率。
void
setVideoFrameRate(int rate)
设置录制视频的捕获帧速率。
void
setVideoSize(int width, int height)
设置要拍摄的宽度和视频的高度。
void
setVideoSource(int video_source)
设置用于录制的视频来源。
void
start()
开始录制。
void
stop()
停止录制。