Android中的MediaRecorder录音与录像
Android系统不仅支持播放多媒体文件,还能够从设备硬件中捕获多媒体数据,例如通过麦克风录音或摄像头录像。本文将详细介绍如何使用MediaRecorder在Android中实现录音和录像功能,并通过示例代码加以说明。
MediaRecorder概述
MediaRecorder主要用于记录音频和视频,位于android.media.MediaRecorder包下。它为开发者提供了丰富的API来实现录音和录像功能。以下是一些常用方法的简要说明:
prepare():准备开始录音或录像。start():开始录音或录像。stop():停止录音或录像。reset():重置MediaRecorder的状态。release():释放MediaRecorder占用的资源。setAudioEncoder(int):设置音频编码格式。setAudioSource(int):设置音频输入源。setOutputFormat(int):设置输出媒体文件的格式。setPreviewDisplay(Surface):设置视频预览界面。setVideoEncoder(int):设置视频编码格式。setVideoSource(int):设置视频输入源。setOutputFile(String):指定输出媒体文件的路径。setMaxDuration(int):设置最大录制时长(单位:毫秒)。
需要注意的是,MediaRecorder的状态机决定了其方法的调用顺序。只有处于特定状态下,才能调用相应的方法。下图展示了官方文档中的状态转换图:

录音实现
以下是一个简单的录音示例代码,录音文件将保存在SD卡根目录下:
package cn.bgxt.mediarecorderdemo;
import android.app.Activity;
import android.media.MediaRecorder;
import android.media.MediaRecorder.OnErrorListener;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class RecordActivity extends Activity {
private Button btnStart, btnStop;
private MediaRecorder mediaRecorder;
private boolean isRecording;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_record);
btnStart = (Button) findViewById(R.id.btnStart);
btnStop = (Button) findViewById(R.id.btnStop);
btnStop.setEnabled(false);
btnStart.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startRecording();
}
});
btnStop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
stopRecording();
}
});
}
private void startRecording() {
try {
File file = new File("/sdcard/mediarecorder.amr");
if (file.exists()) {
file.delete();
}
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.setOnErrorListener(new OnErrorListener() {
@Override
public void onError(MediaRecorder mr, int what, int extra) {
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
isRecording = false;
btnStart.setEnabled(true);
btnStop.setEnabled(false);
Toast.makeText(RecordActivity.this, "录音发生错误", Toast.LENGTH_SHORT).show();
}
});
mediaRecorder.prepare();
mediaRecorder.start();
isRecording = true;
btnStart.setEnabled(false);
btnStop.setEnabled(true);
Toast.makeText(RecordActivity.this, "开始录音", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
private void stopRecording() {
if (isRecording) {
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
isRecording = false;
btnStart.setEnabled(true);
btnStop.setEnabled(false);
Toast.makeText(RecordActivity.this, "录音结束", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
if (isRecording) {
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
}
super.onDestroy();
}
}
为了使应用程序能够录音,需要在AndroidManifest.xml中添加以下权限:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
录像实现
以下是一个使用MediaRecorder进行录像的示例代码,录像文件将保存在SD卡根目录下:
package cn.bgxt.mediarecorderdemo;
import android.app.Activity;
import android.media.MediaRecorder;
import android.media.MediaRecorder.OnErrorListener;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class VideoActivity extends Activity {
private Button btnStart, btnStop;
private SurfaceView svView;
private boolean isRecording;
private MediaRecorder mediaRecorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video);
btnStart = (Button) findViewById(R.id.btnStart);
btnStop = (Button) findViewById(R.id.btnStop);
svView = (SurfaceView) findViewById(R.id.svView);
btnStop.setEnabled(false);
btnStart.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startRecording();
}
});
btnStop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
stopRecording();
}
});
svView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
private void startRecording() {
try {
File file = new File("/sdcard/video.mp4");
if (file.exists()) {
file.delete();
}
mediaRecorder = new MediaRecorder();
mediaRecorder.reset();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mediaRecorder.setVideoFrameRate(4);
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.setPreviewDisplay(svView.getHolder().getSurface());
mediaRecorder.setOnErrorListener(new OnErrorListener() {
@Override
public void onError(MediaRecorder mr, int what, int extra) {
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
isRecording = false;
btnStart.setEnabled(true);
btnStop.setEnabled(false);
Toast.makeText(VideoActivity.this, "录制出错", Toast.LENGTH_SHORT).show();
}
});
mediaRecorder.prepare();
mediaRecorder.start();
isRecording = true;
btnStart.setEnabled(false);
btnStop.setEnabled(true);
Toast.makeText(VideoActivity.this, "开始录像", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
private void stopRecording() {
if (isRecording) {
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
isRecording = false;
btnStart.setEnabled(true);
btnStop.setEnabled(false);
Toast.makeText(VideoActivity.this, "停止录像,并保存文件", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
if (isRecording) {
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
}
super.onDestroy();
}
}
为了使用摄像头进行录像,需要在AndroidManifest.xml中添加以下权限:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
总结
通过MediaRecorder,开发者可以轻松实现音频和视频的录制功能。本文通过详细的代码示例和权限说明,展示了如何在Android应用中使用MediaRecorder进行录音和录像。希望这些内容能帮助开发者更好地理解和使用MediaRecorder。