MediaRecoder除了用于录制音频之外,还可用于录制视频,其步骤与录制音频基本相同,只是录制视频不仅要采集声音,还要采集图像,需要使用SurfaceView来预览显示图像,下面用一个简单示例来演示,代码如下:
Activity:
package com.home.recordvideo; import java.io.File; import android.app.Activity; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; 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 RecordVedioActivity extends Activity implements OnClickListener { private Button recordBtn, stopBtn; // 系统的视频文件 private File videoFile; private MediaRecorder mRecorder; // 显示视频预览的SurfaceView private SurfaceView sView; // 记录是否正在进行录制 private boolean isRecording; private SurfaceHolder sholder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); recordBtn = (Button) findViewById(R.id.main_btn_record); stopBtn = (Button) findViewById(R.id.main_btn_stop); // 让stopBtn按钮不可用 stopBtn.setEnabled(false); stopBtn.setOnClickListener(this); recordBtn.setOnClickListener(this); // 获取界面中的SurfaceView sView = (SurfaceView) findViewById(R.id.main_sView); sholder = sView.getHolder(); // 设置SurfaceView不需要自己维护缓冲区 sholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 设置分辨率 sholder.setFixedSize(800, 480); // 设置该组件让屏幕不会自动关闭 sholder.setKeepScreenOn(true); } @Override public void onClick(View v) { if (v == recordBtn) { if (!Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState())) { Toast.makeText(RecordVedioActivity.this, "SD卡不存在,请插入SD卡!", Toast.LENGTH_SHORT).show(); return; } try { // 创建保存录制视频的视频文件 videoFile = new File(Environment.getExternalStorageDirectory() .getCanonicalFile() + "/yvideo.mp4"); // 创建MediaRecorder对象 mRecorder = new MediaRecorder(); mRecorder.reset(); // 设置从麦克风采集声音 mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置从摄像头采集图像 mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置视频文件的输出格式(必须在设置声音编码格式、图像编码格式之前设置) mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 设置声音的编码格式 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); // 设置图像的编码格式 mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); mRecorder.setVideoSize(800, 480); // 每秒4帧 mRecorder.setVideoFrameRate(4); mRecorder.setOutputFile(videoFile.getAbsolutePath()); // 指定使用SurfaceView来预览视频 mRecorder.setPreviewDisplay(sView.getHolder().getSurface()); mRecorder.prepare(); // 让record按钮不可用 recordBtn.setEnabled(false); // 让stopBtn按钮可用 stopBtn.setEnabled(true); isRecording = true; // 开始录制 mRecorder.start(); System.out.println("-----recording-----"); } catch (Exception e) { e.printStackTrace(); } } if (v == stopBtn) { // 如果正在录制视频 if (isRecording) { // 停止录制 mRecorder.stop(); // 释放资源 mRecorder.release(); mRecorder = null; // 让record按钮可用 recordBtn.setEnabled(true); // 让stopBtn按钮不可用 stopBtn.setEnabled(false); } } } }
布局XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="horizontal" > <Button android:id="@+id/main_btn_record" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="录制视频" /> <Button android:id="@+id/main_btn_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止录制" /> </LinearLayout> <SurfaceView android:id="@+id/main_sView" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
加上如下权限:
<!-- 授予该程序录制声音的权限 --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 授予该程序使用摄像头的权限 --> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 授予该程序使用外部存储器的权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />