繁体   English   中英

相机预览方向为横向,但设备为纵向

[英]Camera preview orientation is in landscape but device is in portrait

我在camera2 API中预览的方向有问题。 即使设备处于纵向模式,我得到的预览还是横向的。 更准确地说,我得到的传感器旋转为90,因此,传感器数据也映射为90。观测值位于仿真器(Nexus 5)上。

private void startPreview() {
    SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
    surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
    Surface previewSurface = new Surface(surfaceTexture);

    try {
        mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        mCaptureRequestBuilder.addTarget(previewSurface);

        mCameraDevice.createCaptureSession(Arrays.asList(previewSurface),
                new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
                try {
                    cameraCaptureSession.setRepeatingRequest(mCaptureRequestBuilder.build(),
                            null, mBackgroundHanlder);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {

            }
        }, null);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }

}

private void setupCamera(int width, int height) {
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    try {
        for(String cameraId: cameraManager.getCameraIdList()) {
            CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
            if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING)
                    == CameraCharacteristics.LENS_FACING_FRONT) {
                continue;
            }
            StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);

            int deviceOrientation = getWindowManager().getDefaultDisplay().getRotation();
            mTotalRotation = sensorToDeviceRotation(cameraCharacteristics, deviceOrientation);
            boolean swapRotation = mTotalRotation == 90 || mTotalRotation == 270;
            int rotatedWidth = width;
            int rotatedHeight = height;

            if (swapRotation) {
                rotatedHeight = width;
                rotatedWidth = height;
            }
            mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), rotatedWidth, rotatedHeight);
            mVideoSize = chooseOptimalSize(map.getOutputSizes(MediaRecorder.class), rotatedWidth, rotatedHeight);

            mcameraId = cameraId;
            return;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

}


private static int sensorToDeviceRotation(CameraCharacteristics cameraCharacteristics, int deviceOrientation) {
    int sensorOrientation = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
    deviceOrientation = ORIENTATIONS.get(deviceOrientation);
    return (sensorOrientation+deviceOrientation+360)%360;
}

看起来您实际上并没有将旋转变换应用于输出帧。 仅交换宽度/高度并不能执行任何操作,因为通常相机仅支持横向分辨率。

您需要使用TextureView的getTransform和setTransform函数来添加必要的旋转。

特别:

  1. 使用getTransform读取当前转换
  2. 将该变换乘以您根据UI方向计算出的必要旋转变换
  3. 使用setTransform将其设置为TextureView变换

Camera2Basic示例应用程序的代码在这里可能会有所帮助,尽管我不确定它是否设置为纵向显示: https : //github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java /com/example/android/camera2basic/Camera2BasicFragment.java

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM