Camera2录像流程浅析

昨天分享了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()结束录像。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值