昨天分享了Camera2预览拍照的流程,今天简单分享一下Camera2录像的实现过程。总的来说Camera2实现录像和实现预览拍照的方法差不多(只有细微差别,需要使用MediaRecorder记录数据,使用的CameraDeciue
1、首先和预览拍照一样,实现和相机有关的功能必须先获取相机服务即获取CameraManager对象。
CameraManager mCameraManager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);
2、获取CameraManager只是用来对Camera服务进行管理,实际使用的时候需要选择特定的CameraId,打开相应的CameraDevice,然后再进行相应的操作(功能实现)。
String[] CameraIdList = mCameraManager.getCameraIdList();
//选择CameraIdList里面的相应Id
mCameraManager.openCamera(CameraId,CameraDevice.StateCallback,handler);
//在CameraDevice.StateCallback的onOpened()中选择相应的CameraDevice
CameraDeice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback(){
public void onOpened(CameraDevice device){
mCameraDevice = device;
}
}
3、和预览拍照一样,获取到了相应的CamerDevice之后,需要新建一个CaptureRequest.Builder以用来实现像CaptureSession发送请求,
CaptureRequest.Builder mVideoRecorder = mDevice.createCaptureRequest(CameraDevice.TEMPLATE_VIDEO_SNAPSHOT)
//这里支持录像的模板有很多,使用CameraDevice_TEMPLATE_VIDEO_SNAPSHOT是因为该模板支持在录像的情况下进行拍照
mVideoRecorder.addTarget(mMediaRecorder.getSurface());
mVideoRecorder.addtarget(preViewSurface);
4、和拍照预览一样,创建完了CaptureRequest.Builder之后,接下来就是创建CaptureSession
mCameraDevice.createCaptureSession(Arrays.asList(mMediaRecorder.getSurface(),previewSurface,mImageReader.getSurface()),new CameraCaptureSession.StateCallback(){
public void onconfiged(CameraCaptureSession capturesession){
mRecorderSession = capturesession;
//设置AE、AF参数
mRecorderSession.setRepeatingRequest(mVideoRecorder.build(),listener,handler);
}
},handler);
5、可以发现,和预览拍照不同的是,我们这里多了一个mMediaRecorder的成员,该成员是MediaRecorder类的一个实例对象,用来实时记录录像过程中捕捉到的数据,在使用之前,需要对其进行初始化。
/***重置mMediaRecorder***/
mMediaRecorder.reset();
//设置输出格式为MP4
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
//设置视频的size
mMediaRecorder.setVideoSize(mRecordSize.getWidth(),mRecordSize.getHeight());
//设置视频帧率
mMediaRecorder.setVideoFrameRate(24);
//设置编码率
mMediaRecorder.setVideoEncodingBitRate(700*1024);
//设置视频编码格式
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
//设置音频编码格式
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//设置方向
mMediaRecorder.setOrientationHint(90);
//新建文件保存视频
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String videoname = sdf.format(new Date())+".mp4";
Vfile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath()+ videoname);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//设置输出文件
mMediaRecorder.setOutputFile(Vfile);
try {
//准备mMediaRecorder
mMediaRecorder.prepare();
}catch (IOException e){
e.printStackTrace();
}
需要注意的是,对mMedaiRecorder进行初始化之前,一定要先重置mMediaRecorder,否者可能会出现mMediaRecorder的某属性has been set...的报错(我第一次写的时候报错了,后来没有报错)
6、最后就是使用按键的监听事件开始和停止录像,按键点击开始录像时,使用mMediaRecorder.start()开始录像,再次点击按键时,使用mMediaRecorder.stop()结束录像。