studio example camera2video autofittextureview android android-6.0-marshmallow android-camera2

android - camera2video - camera2 surfaceview example



La aplicaciĆ³n Camera2basic, tiene una vista previa muy oscura en Android 6.0 LGG3 (3)

La nueva API, tal vez solo en LG G3, parece haber cambiado algo.

Estoy usando el código de ejemplo .

En mi nexus 4, el código se ejecuta perfectamente, pero en LGG3 actualizado a Android 6.0 no lo hace. ¿Algunas ideas?

Jugué con la configuración, pero no tuve suerte, esto todavía funciona bien en Nexus 4:

mPreviewRequestBuilder.set(CaptureRequest.BLACK_LEVEL_LOCK, false); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AWB_LOCK, false); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_AUTO); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, CaptureRequest.CONTROL_AE_ANTIBANDING_MODE_AUTO); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0); //mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, Range.create(1000,1000)); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, 0); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO); mPreviewRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, CaptureRequest.CONTROL_MODE_AUTO); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);


El rango de FPS para Camera2 API parece usar una escala diferente a la de Camera API más antigua. Por lo tanto, si está recibiendo un rango de fps de vista previa compatible (0, 30000), debe establecer los valores divididos por 1000:

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, Range.create(0, 30));

Pruebe si esto ayuda, ya que ayudó con la API de la cámara anterior.


Establecer la CONTROL_AE_TARGET_FPS_RANGE correcta es la clave.

Hay algunas razones por las que esto puede salir mal. Como dijo @Anton Malyshev, algunos dispositivos te dan CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES multiplicado por 1000. Por lo tanto, debes dividirlo por 1000 al configurar CONTROL_AE_TARGET_FPS_RANGE.

Otra razón por la que me di cuenta es que la exposición automática falla para un FPS más alto dependiendo de la resolución. Así que una solución simple que hice fue establecer el rango inferior en 0.

Por ejemplo, si CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES tiene 24000: 24000, luego de dividir y establecer el valor inferior en 0, el rango sería 0:24


He encontrado la solución que funciona para mí. La solución es configurar el rango de FPS que admite el dispositivo.

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, getRange());

Función para obtener rango:

private Range<Integer> getRange() { CameraCharacteristics chars = mCameraManager.getCameraCharacteristics(mCameraId); Range<Integer>[] ranges = chars.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); Range<Integer> result = null; for (Range<Integer> range : ranges) { int upper = range.getUpper(); // 10 - min range upper for my needs if (upper >= 10) { if (result == null || upper < result.getUpper().intValue()) { result = range; } } } if (result == null) { result = ranges[0]; } return result; }

Actualización: otras configuraciones (si alguien interesado en)

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_AUTO); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); mPreviewRequestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, CameraMetadata.STATISTICS_FACE_DETECT_MODE_SIMPLE);