使用MediaRecoder录制视频

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" />




 

你可能感兴趣的:(android,SurfaceView,录制视频,MediaRecoder)