随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)
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" />