Camera1 и Camera2 apis показывают разные параметры размера видео - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь запустить и играть с Android Camera2 API, используя демо здесь: https://github.com/googlesamples/android-Camera2Basic

Как я вижу, демонстрационная программа использует список размеров и автоматически выбирает один для предварительного просмотра и один для размера видео на основе соотношения:

CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
... try ...
String cameraId = manager.getCameraIdList()[0];

// Choose the sizes for camera preview and video recording
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
StreamConfigurationMap map = characteristics
                .get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
mSensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
if (map == null) {
    throw new RuntimeException("Cannot get available preview/video sizes");
}
Size[] outputSizes = map.getOutputSizes(MediaRecorder.class);
mVideoSize = chooseVideoSize(outputSizes);
Size[] previewSizes = map.getOutputSizes(SurfaceTexture.class);
mPreviewSize = chooseOptimalSize(previewSizes,
     width, height, mVideoSize);

Проблема в том, что некоторые разрешения недоступны. Например, для моей Galaxy J7 (android 8.1) камера может снимать видео с разрешением 1072x1072, но этого нет в списке доступных разрешений. Если я попытаюсь установить это разрешение самостоятельно на медиа-рекордере, произойдет сбой конфигурации:

    private MediaRecorder mMediaRecorder;
    ...
    mMediaRecorder.setVideoSize(1072, 1072);

А вот метод onConfigureFailed, вызываемый при попытке записи.

mCameraDevice.createCaptureSession( Collections.singletonList(previewSurface),
    new CameraCaptureSession.StateCallback() {
       @Override
       public void onConfigured(@NonNull CameraCaptureSession session) {
           mPreviewSession = session;
           updatePreview();
       }

       @Override
       public void onConfigureFailed(@NonNull CameraCaptureSession session) {
            Activity activity = getActivity();
            if (null != activity) {
                 Toast.makeText(activity, "Failed", Toast.LENGTH_SHORT).show();
            }
       }
    }, mBackgroundHandler);

Однако, если я использую параметры размера видео с помощью API-интерфейса Camera1, я получаю различные параметры:

Camera camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
Camera.Parameters camParams = camera.getParameters();

// Find a preview size that is at least the size of our IMAGE_SIZE
List<Camera.Size> supportedPreviewSizes = camParams.getSupportedPreviewSizes();
Camera.Size previewSize = supportedPreviewSizes.get(0);

Одним из них действительно является разрешение 1072x1072, которое можно использовать с моим приложением по умолчанию для камеры.

Я пытаюсь использовать соотношение сторон 1: 1, но единственное разрешение для этого при использовании camera2 api - 3088x3088, что слишком велико. Есть ли в любом случае, я могу решить это?

...