video recording using camera 2

Viewed 62

I am trying to record video using media recorder and camera2 but the app crashes as soon as mediarecorder.start() function is encountered. In the oncreate first prepareCamera is called and then trigger is called. I am a bit new to camera2. Can anyone help me find out why it is happening so?

 public void prepareCamera() throws CameraAccessException {
    manager = (CameraManager) getSystemService(CAMERA_SERVICE);
    String[] cameras = manager.getCameraIdList();
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        Log.v("mycontroller","permission not granted");
        return;
    }
    Log.v("mycontroller","permission granted "+cameras[0]);
    manager.openCamera(cameras[0], new CameraDevice.StateCallback(){
        @Override
        public void onOpened(CameraDevice camera) {
            Log.v("mycontroller","camera opened");
            mCamera2 = camera;
            mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
            try {
                mediaRecorder.setOutputFile(createFile().getAbsolutePath());
                mediaRecorder.prepare();
                Log.v("mycontroller","recorder prepared");
                List<Surface> list = new ArrayList<>();
                list.add(mediaRecorder.getSurface());
                final CaptureRequest.Builder captureRequest = mCamera2.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
                captureRequest.addTarget(mediaRecorder.getSurface());
                mCaptureRequest = captureRequest.build();
                mCamera2.createCaptureSession(list, new CameraCaptureSession.StateCallback(){
                    @Override
                    public void onConfigured(CameraCaptureSession session) {
                        mSession = session;
                    }

                    @Override
                    public void onConfigureFailed(CameraCaptureSession session) {
                        mSession = session;
                    }
                }, null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onDisconnected(CameraDevice camera) {}
        @Override
        public void onError(CameraDevice camera, int error) {}
    }, null);
}
public void trigger() {
    try {
            mediaRecorder.start();
            mSession.setRepeatingRequest(mCaptureRequest,
                    new CameraCaptureSession.CaptureCallback() {
                        @Override
                        public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber) {
                            Log.v("mycontroller","camera started capturing");
                            super.onCaptureStarted(session, request, timestamp, frameNumber);
                        }
                        @Override
                        public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
                            Log.v("mycontroller","camera stoped capturing");
                            super.onCaptureCompleted(session, request, result);
                        }
                    }, null);
    } catch (CameraAccessException e) {
        Log.v("mycontroller",e.getMessage());
        e.printStackTrace();
    }
}

private void releaseMediaRecorder() throws CameraAccessException {
    mSession.stopRepeating();
    try {
        mediaRecorder.stop();
        mediaRecorder.reset();
        mediaRecorder.release();
    }
    catch (Exception e){}
    mediaRecorder= null;
    mCamera2=null;
}
1 Answers
Related