Android 视频刻录
可以通过调用系统自带的相机来实现,不过这样做灵活性较低,我们可以通过使用MediaRecorder对象和SurfaceView控件来实现视频刻录。这里要求应用时横屏全屏显示。
界面设计
横屏和全屏
横屏显示
我们在AndroidManifest.xml文件中,为我们需要横屏显示的Activity添加相应的属性:
android:screenOrientation="landscape"
全屏显示
在加载界面之前对Activity进行配置:
//去掉标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
应用界面
主要包含两部分,用于显示摄像头采集回显的预览画面,由SurfaceView来实现,另外就是停止和开始录制两个Button了,与相机应用类似,我们需要在帧布局嵌入相对布局来实现。
界面设计如下:
这里相对布局的visibility的属性值为gone,我们通过在MainActivity中重写onTouchEvent()方法来实现触摸显示。
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// or layout.setVisibility(ViewGroup.VISIBLE);
layout.setVisibility(RelativeLayout.VISIBLE);
}
return super.onTouchEvent(event);
}
业务逻辑
配置SurfaceView
首先找到SurfaceView对象,通过getHolder()方法获取SurfaceHolder对象并进行相应配置:
surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.getHolder().setKeepScreenOn(true);
配置MediaRecorder对象
类似于MediaPlay,我们对其创建出来的对象进行相应的配置,主要有以下内容:
视频来源
声音来源
视频输出格式
视频编码格式
帧率
声音编码格式
文件输出路径
视频预览输出对象
File file = new File(SD_ROOTPATH, SYSTEMTIME + ".3gp");
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//mediaRecorder.setVideoSize(320, 240);
mediaRecorder.setVideoFrameRate(10);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
完成配置之后,就可以开始缓冲并开始录制了:
mediaRecorder.prepare();
mediaRecorder.start();