使用MediaRecorder和SurfaceView录制视频
手机一般都提供麦克风和摄像头硬件,而Android系统可以利用该硬件来录制视频了
——使用MediaRecorder录制视频的步骤:
1)创建MediaRecorder对象
2)调用MediaRecorder对象的setVideoSource()方法设置视频的来源,一般传入MediaRecorder.VideoSource.CAMERA参数指定录制来自摄像头的图像
3)调用MediaRecorder对象的setAudioSource()方法设置声音来源,一般传入MediaRecorder.AudioSource.MIC参数指定录制来自麦克风的声音
4)调用MediaRecorder对象的setOutputFormat()设置录制音频文件的格式。
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
5)调用MediaRecorder对象的setVideoEncoder设置录制的视频的编码格式等。这些参数将可以控制所录制的视频的品质,文件的大小,一般视频品质越好,视频文件越大。
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
6)调用MediaRecorder对象的setAudioEncoder,setAudioEncodingBitRate(int)
,setAudioSamplingRate(int)设置录制的声音的编码格式,编码位率,采样率等。
这些参数将可以控制所录制的声音的品质,文件的大小,一般声音品质越好,
声音文件越大。
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
7)调用setVideoFrameRate(20)设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错。
8)调用setVideoSize(176, 144);设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错。
9)调用setPreviewDisplay(sv.getHolder().getSurface());这是视频的预览效果。
10)调用MediaRecorder对象的setOutputFile(String)设置录制文件的保存的位置。
11)调用MediaRecorder的prepare()方法准备录制。
12)调用MediaRecorder对象的start()方法开始录制。
13)录制完成,调用MediaRecorder对象的stop()方法停止录制,并调用release()方法释放资源。
注意:需要的权限:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/>代码编写:
1.布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始录制" android:onClick="start" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止录制" android:onClick="stop"/> <SurfaceView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/sv" /> </LinearLayout>MainActivity:
开始录制:
public void start(View view){ //设置视频和音频的来源 mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //设置录制视频的编码格式 mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //设置音频的编码格式 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB); //设置视频的帧率:每秒切换图片的次数 mediaRecorder.setVideoFrameRate(20); //视频的分辨率 mediaRecorder.setVideoSize(176, 144); mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/111.mp4"); try { mediaRecorder.prepare(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } mediaRecorder.start(); }停止录制:
public void start(View view){ //设置视频和音频的来源 mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //设置录制视频的编码格式 mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //设置音频的编码格式 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB); //设置视频的帧率:每秒切换图片的次数 mediaRecorder.setVideoFrameRate(20); //视频的分辨率 mediaRecorder.setVideoSize(176, 144); mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/111.mp4"); try { mediaRecorder.prepare(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } mediaRecorder.start(); }效果图: