首页 > 解决方案 > 使用相机 2 录制视频

问题描述

我正在尝试使用媒体记录器和 camera2 录制视频,但一旦mediarecorder.start()遇到功能,应用程序就会崩溃。在第oncreate一个prepareCamera被调用,然后trigger被调用。我对camera2有点陌生。谁能帮我找出为什么会这样?

 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;
}

标签: javaandroidandroid-camera2mediarecorder

解决方案


查看 Google 的 Camera2Video 示例,看看您是否可以找到代码和示例之间的任何关键差异:

https://github.com/googlearchive/android-Camera2Video/tree/master/Application/src/main/java/com/example/android/camera2video

您可能需要设置更多 MediaRecorder 设置,例如分辨率;通常使用CamcorderProfile类很容易做到这一点。


推荐阅读