MediaRecorder除了可以用于录制音频,还可用于录制视频。关于MediaRecorder的详解大家可以参考《Android开发之MediaRecorder类详解》。使用MediaRecorder录制视频与录制音频的步骤基本相同。只是录制视频时不仅需要采集声音,还需要采集图像。为了让MediaRecorder录制时采集图像,应该在调用setAudioSource(int audio source)方法时再调用setVideoSource(int video source)方法来设置图像来源。
除此之外,还需在调用setOutputFormat()设置输出文件格式之后进行如下步骤:
1) 调用MediaRecorder 对象的setVideoEncoder()、setVideoEncodingBitRate(intbitRate)、setVideoFrameRate设置所录制的视频的编码格式、编码位率、每秒多少帧等,这些参数将可以控制所录制的视频的品质、文件的大小。一般来说,视频品质越好,视频文件越大。
2) 调用 MediaRecorder的setPreviewDisplay(Surfacesv)方法设置使用哪个SurfaceView来显示视频预览。
剩下的代码则与录制音频的代码基本相同:
实例使用MediaRecorder录制视频:
1.RecordVideo类:
package com.jph.recordvideo; import java.io.File; import android.app.Activity; import android.content.pm.ActivityInfo; import android.graphics.PixelFormat; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; import android.widget.ImageButton; import android.widget.Toast; /** * Description: * 使用MediaRecorder录制视频 * @author jph * Date:2014.08.14 * <br/> */ public class RecordVideo extends Activity implements OnClickListener { // 程序中的两个按钮 ImageButton record , stop; // 系统的视频文件 File videoFile ; MediaRecorder mRecorder; // 显示视频预览的SurfaceView SurfaceView sView; // 记录是否正在进行录制 private boolean isRecording = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 去掉标题栏 ,必须放在setContentView之前 requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); // 设置横屏显示 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // 设置全屏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // 选择支持半透明模式,在有surfaceview的activity中使用。 getWindow().setFormat(PixelFormat.TRANSLUCENT); // 获取程序界面中的两个按钮 record = (ImageButton) findViewById(R.id.record); stop = (ImageButton) findViewById(R.id.stop); // 让stop按钮不可用。 stop.setEnabled(false); // 为两个按钮的单击事件绑定监听器 record.setOnClickListener(this); stop.setOnClickListener(this); // 获取程序界面中的SurfaceView sView = (SurfaceView) this.findViewById(R.id.sView); // 设置分辨率 sView.getHolder().setFixedSize(1280, 720); // 设置该组件让屏幕不会自动关闭 sView.getHolder().setKeepScreenOn(true); } @Override public void onClick(View source) { switch (source.getId()) { // 单击录制按钮 case R.id.record: if (!Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED)) { Toast.makeText(RecordVideo.this , "SD卡不存在,请插入SD卡!" , Toast.LENGTH_SHORT).show(); return; } try { // 创建保存录制视频的视频文件 videoFile = new File(Environment .getExternalStorageDirectory() .getCanonicalFile() + "/testvideo.3gp"); // 创建MediaPlayer对象 mRecorder = new MediaRecorder(); mRecorder.reset(); // 设置从麦克风采集声音(或来自录像机的声音AudioSource.CAMCORDER) mRecorder.setAudioSource(MediaRecorder .AudioSource.MIC); // 设置从摄像头采集图像 mRecorder.setVideoSource(MediaRecorder .VideoSource.CAMERA); // 设置视频文件的输出格式 // 必须在设置声音编码格式、图像编码格式之前设置 mRecorder.setOutputFormat(MediaRecorder .OutputFormat.THREE_GPP); // 设置声音编码的格式 mRecorder.setAudioEncoder(MediaRecorder .AudioEncoder.AMR_NB); // 设置图像编码的格式 mRecorder.setVideoEncoder(MediaRecorder .VideoEncoder.H264); mRecorder.setVideoSize(1280, 720); // 每秒 4帧 mRecorder.setVideoFrameRate(20); mRecorder.setOutputFile(videoFile.getAbsolutePath()); // 指定使用SurfaceView来预览视频 mRecorder.setPreviewDisplay(sView .getHolder().getSurface()); //① mRecorder.prepare(); // 开始录制 mRecorder.start(); System.out.println("---recording---"); // 让record按钮不可用。 record.setEnabled(false); // 让stop按钮可用。 stop.setEnabled(true); isRecording = true; } catch (Exception e) { e.printStackTrace(); } break; // 单击停止按钮 case R.id.stop: // 如果正在进行录制 if (isRecording) { // 停止录制 mRecorder.stop(); // 释放资源 mRecorder.release(); mRecorder = null; // 让record按钮可用。 record.setEnabled(true); // 让stop按钮不可用。 stop.setEnabled(false); } break; } } }
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 显示视频预览的SurfaceView --> <SurfaceView android:id="@+id/sView" android:layout_width="match_parent" android:layout_height="match_parent" /> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true"> <ImageButton android:id="@+id/record" android:layout_width="66dp" android:layout_height="66dp" android:scaleType="fitCenter" android:src="@drawable/recored" /> <ImageButton android:id="@+id/stop" android:layout_width="66dp" android:layout_height="66dp" android:scaleType="fitCenter" android:src="@drawable/stop" /> </LinearLayout> </RelativeLayout>
3.为程序添加相应权限:
<!-- 授予该程序录制声音的权限 --> <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"/>
4.程序运行预览: