一,自定义录制
1.首先使用到的类
MediaRecorder 这是实现视频录制的类,同时也可以实现音频录制
SurfaceView ,SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。这个控件用于显示录制视频的控件,相当于录制的时候的预览
SurfaceHolder surface的控制器,用来操纵surface,处理它的Canvas上画的效果和动画,控制表面,大小,像素等。
2. 开始录制
1.首先在布局文件中 添加SurfaceView 控件 再添加一个开始按钮,一个结束按钮
<SurfaceView
android:id="@+id/surfaceview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</SurfaceView>
2. 查找到SurfaceView 控件 获取 SurfaceHolder
SurfaceHolder holder = surfaceview.getHolder();// 取得holder
holder.addCallback(this); // holder加入回调接口 给SurfaceView当前的持有者一个回调对象。 需要实现其方法,匿名内部类也可以
// setType必须设置,要不出错.
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//注释-----解释----
SURFACE_TYPE_NORMAL:用RAM缓存原生数据的普通Surface
SURFACE_TYPE_HARDWARE:适用于DMA(Direct memory access )引擎和硬件加速的Surface
SURFACE_TYPE_GPU:适用于GPU加速的Surface
SURFACE_TYPE_PUSH_BUFFERS:表明该Surface不包含原生数据,Surface用到的数据由其他对象提供,在Camera图像预览中就使用该类型的Surface,有 Camera 负责提供给预览Surface数据,这样图像预览会比较流畅。如果设置这种类型则就不能调用lockCanvas来获取Canvas对象了。
3.给开始按钮添加监听事件
mediarecorder = new MediaRecorder();// 创建mediarecorder对象
mediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 录音源为麦克风
mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置录制视频源为Camera(相机)
mediarecorder .setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); // 设置录制的视频编码h263 h264
mediarecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
mediarecorder.setVideoSize(176, 144); // 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
mediarecorder.setVideoFrameRate(20);//设置逐帧率
mediarecorder.setPreviewDisplay(surfaceHolder.getSurface()); // 将视频 设置预览 的surface
mediarecorder .setAudioEncodingBitRate( 256 * 1024 );// 128K
File folder = FileUtils.getMediaRecorderFolder(this); // 4. 设置录音要保存的位置 自定义的文件保存类 用于存储文件
File targetFile = new File(folder, "vedio" + System.currentTimeMillis() + ".3gp");
mediarecorder.setOutputFile(targetFile.getAbsolutePath());
try {
mediarecorder.prepare();// 准备录制
mediarecorder.start();// 开始录制
} catch (IllegalStateException e) {
e.printStackTrace(); // TODO Auto-generated catch block
} catch (IOException e) {
e.printStackTrace(); // TODO Auto-generated catch block
}
3. 实现其回调接口
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
surfaceHolder = holder;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
surfaceHolder = holder;
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// surfaceDestroyed的时候同时对象设置为null
surfaceview = null;
surfaceHolder = null;
mediarecorder = null;
}
3. 停止按钮的事件
if (mediarecorder != null) {
// 停止录制
mediarecorder.stop();
// 释放资源
mediarecorder.release();
mediarecorder = null;
}
二,使用意图录制
Intent i = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
File folder = FileUtils.getMediaRecorderFolder(this);
File targetFile = new File(folder, "a " + System.currentTimeMillis() + ".3gp");
Uri imageFileUri = Uri.fromFile(targetFile);
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
i.putExtra(android.provider.MediaStore.EXTRA_VIDEO_QUALITY, 1);
startActivityForResult(i, 102);