0

我尝试通过单击按钮来实现高速捕获会话。这是我的状态回调:

private CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() {

    @Override
    public void onOpened(CameraDevice cameraDevice) {
        mCameraDevice = cameraDevice;
        startPreview();
    }

    @Override
    public void onDisconnected(CameraDevice cameraDevice) {
        mCameraOpenCloseLock.release();
        cameraDevice.close();
        mCameraDevice = null;
    }

    @Override
    public void onError(CameraDevice cameraDevice, int error) {
        mCameraOpenCloseLock.release();
        cameraDevice.close();
        mCameraDevice = null;
    }

};

打开相机方法:

 private void openCamera() throws CameraAccessException {
     CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
    try {
        mCameraCharacteristics = manager.getCameraCharacteristics(String.valueOf(currentCamID));
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
    manager.openCamera(String.valueOf(currentCamID), mCameraDeviceStateCallback, mHandler);
}

在开始预览和 onClick 事件时调用

  private void createCaptureSession(List<Surface> surfaces) throws CameraAccessException {

    if(mPreviewSession!=null){
        mPreviewSession.close();
        mPreviewSession = null;
    }
    if (!isHighSpeed) {
        Log.d(LOG_TAG, "createCaptureSession isHighSpeed" +isHighSpeed );

        mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {

            @Override
            public void onConfigured(CameraCaptureSession cameraCaptureSession) {
                Log.i(LOG_TAG, "CameraCaptureSession onConfigured :" + cameraCaptureSession.hashCode());
                mPreviewSession = cameraCaptureSession;
                updatePreview();
            }

            @Override
            public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {

            }
        }, mHandler);
    } else {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Log.d(LOG_TAG, "createCaptureSession isHighSpeed" +isHighSpeed );
            mCameraDevice.createConstrainedHighSpeedCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {

                @Override
                public void onConfigured(CameraCaptureSession cameraCaptureSession) {
                    Log.i(LOG_TAG, "CameraCaptureSession onConfigured :" + cameraCaptureSession.hashCode());

                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        mPreviewSession = cameraCaptureSession;
                    }
                    updatePreview();
                }

                @Override
                public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
                    Log.e(LOG_TAG, "failed");
                }
            }, mHandler);
        }
    }
}

上面调用了更新预览

private void updatePreview() {

    try {
        List<CaptureRequest> captureList = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M && isHighSpeed) {
            StreamConfigurationMap map = mCameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
            Range<Integer>[] highSpeedVideoFpsRanges = map.getHighSpeedVideoFpsRanges();
            mPreviewBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, highSpeedVideoFpsRanges[3]);//hardcode, 3 is the highest size for nexus6p

            captureList = ((CameraConstrainedHighSpeedCaptureSession) mPreviewSession).createHighSpeedRequestList(mPreviewBuilder.build());

            mPreviewSession.setRepeatingBurst(captureList, new CameraCaptureSession.CaptureCallback() {
                @Override
                public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber) {
                    super.onCaptureStarted(session, request, timestamp, frameNumber);
                }
            }, mHandler);
        } else {
            mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, mHandler);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

第一次一切正常,但是,当我尝试再次启动应用程序时,打开相机设备时出现错误,回调中的错误代码 1。没有运行高 fps 一切都很好。要逃避这个问题,设备必须重新启动,这让我很困惑

释放相机:

@Override
public void onCamPause() {
   // super.onCamPause();
    stopPreview();
    closeCamera();
    stopBackgroundThread();
}

private void closePreviewSession() {
    if (mPreviewSession != null) {
        mPreviewSession.close();
        mPreviewSession = null;
    }
}

private void closeCamera() {
    try {
        mCameraOpenCloseLock.acquire();
        if (null != mCamera) {
            mCamera.close();
            mCamera = null;
        }

    } catch (InterruptedException e) {
        throw new RuntimeException("Interrupted while trying to lock camera closing.");
    } finally {
        mCameraOpenCloseLock.release();
    }
}

private void stopBackgroundThread() {
    if (mCameraThread != null) {
        mCameraThread.quitSafely();

        try {
            mCameraThread.join();
            mCameraThread = null;
            mCameraHandler = null;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}`

这是相机的后台线程:

private void initCameraThread() {
    Log.e(TAG, "init camera thread begin.");
    mCameraThread = new HandlerThread("Camera Handler Thread");
    mCameraThread.start();
    mHandler = new Handler(mCameraThread.getLooper());
    Log.e(TAG, "nit camera thread done");
}
4

0 回答 0