Android permite que los dispositivos admitan la transmisión simultánea de dispositivos de cámara. Para Por ejemplo, esto permite que un dispositivo tenga funcionando tanto la cámara frontal como la posterior al mismo tiempo. A partir de Android 11, la API de Camera2 incluye los siguientes métodos que las apps pueden llamar para determinar si las cámaras admiten transmisiones simultáneas y las configuraciones de transmisión compatibles.
getConcurrentCameraIds
: Obtiene el conjunto de combinaciones del dispositivo de cámara conectado actualmente identificadores que admiten la configuración simultánea de sesiones en el dispositivo de la cámara.isConcurrentSessionConfigurationSupported
: Comprueba si el conjunto proporcionado de dispositivos de cámara y sus correspondientes de sesiones separadas pueden establecerse de forma simultánea.
Un conjunto de combinaciones de transmisión obligatorias que se deben admitir durante la transmisión simultánea
de transmisión se incluyen a través de las características de la cámara del dispositivo de cámara en la
SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
propiedad.
Cada dispositivo de cámara que se publicite a través de getConcurrentStreamingCameraIds()
debe cumplir con los siguientes requisitos:
admiten las siguientes configuraciones garantizadas para transmisiones simultáneas.
Objetivo 1 | Objetivo 2 | |||
---|---|---|---|---|
Tipo | Tamaño máximo | Tipo | Tamaño máximo | Casos de uso de muestra |
YUV | S1440p | Procesamiento de imágenes o video en la app | ||
PRIV. | S1440p | Análisis en el visor de la aplicación | ||
JPEG | S1440p | Sin captura de imágenes fijas en el visor | ||
YUV / PRIV | S720p | JPEG | S1440p | Imágenes estáticas estándar |
YUV / PRIV | S720p | YUV / PRIV | S1440p | Video en la app o procesamiento con vista previa |
Dispositivos con la función MONOCHROME
(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
).
incluye
CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
)
que admite Y8 debe admitir la sustitución de transmisiones YUV por Y8 en todas las
combinaciones de novedades.
s720p
hace referencia a 720p (1280 x 720) o a la resolución máxima admitida para el
formato particular devuelto por
StreamConfigurationMap.getOutputSizes()
s1440p
hace referencia a 1,440p (1,920 x 1,440) o a la resolución máxima admitida para
el formato particular devuelto por
StreamConfigurationMap.getOutputSizes()
Dispositivos cuyas capacidades no incluyen
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
debe admitir al menos una transmisión Y16 única, Dataspace::DEPTH
con sVGA
de resolución, durante la operación simultánea, donde sVGA es el más pequeño de los dos
siguientes resoluciones:
- resolución de salida máxima para el formato dado
- 640 x 480
Implementación
Para permitir que las apps consulten un dispositivo a fin de determinar si
que las cámaras admitan transmisiones simultáneas, implementa
ICameraProvider@2.6
Interfaz de HAL, que incluye los siguientes métodos:
Para ver una implementación de referencia de la interfaz de la ICameraProvider@2.6
HAL, consulta
la biblioteca de HAL de la cámara emulada en
EmulatedCameraProviderHWLImpl.cpp
Validación
Para probar que la implementación de esta función se realiza según lo previsto, usa la
ConcurrentCameraTest.java
Prueba de CTS Además, prueba con una app que abra varias cámaras y opere
de forma simultánea.
Problemas de asignación de recursos
Si las HAL de la cámara anuncian compatibilidad con operaciones simultáneas con dispositivos de cámara, podrían tener problemas de asignación de recursos, especialmente cuando hay suficientes recursos del procesador de señales de imagen (ISP) en la teléfono para transmitir las cámaras frontal y posterior (u otras) al mismo tiempo, pero no a a su máxima capacidad. En este caso, la HAL de la cámara debe asignar límites recursos de hardware para cada dispositivo de cámara.
Situación de ejemplo
En la siguiente situación, se demuestra este problema.
Problema
El dispositivo tiene la siguiente configuración:
- El ID de cámara
0
es una cámara lógica respaldada por un lente gran angular y ultra gran angular y cada una toma un recurso de ISP. - El ID de cámara
1
es una cámara que toma un recurso del ISP.
El dispositivo (teléfono) tiene dos ISP. Si el ID de la cámara 0
está abierto y hay una sesión
es posible que la HAL de la cámara reserve dos ISP que anticipen
el uso de cámara ultra gran angular y ultra gran angular.
Si ese es el caso, la cámara frontal (ID 1
) no puede configurar ningún
porque ambos ISP están en uso.
Solución
Para solucionar este problema, el framework puede abrir los IDs de cámara 0
y 1
.
antes de configurar las sesiones para indicarle a la HAL de la cámara cómo
asignar recursos (porque ahora espera el funcionamiento simultáneo de las cámaras).
Sin embargo, esto puede limitar las capacidades. Por ejemplo, es posible que el zoom
capaz de manejar la relación de rango de zoom completa (porque cambiar la cámara física
los IDs podrían ser problemáticos).
Para implementar esta solución, realiza las siguientes actualizaciones en
provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
Exigir que, para el funcionamiento simultáneo de las cámaras, la cámara El framework debe abrir los dispositivos de cámara (
@3.2::ICameraDevice::open
) antes configurar cualquier sesión en los dispositivos de cámara. Esto permite usar la cámara para asignar los recursos en consecuencia.Para abordar el problema de no poder gestionar todo relación del rango de zoom, asegúrate de que las apps de cámara, cuando se usen cámaras al mismo tiempo, se garantiza que usen la configuración de control
ZOOM_RATIO
entre solo 1x yMAX_DIGITAL_ZOOM
en lugar delZOOM_RATIO_RANGE
completo (esta impide el cambio interno de cámaras físicas, lo que potencialmente requiere más ISP).
Problema con testDualCameraPreview
Cuando realizas las actualizaciones anteriores, es posible que se genere un problema con un comportamiento permitido
con la prueba MultiViewTest.java#testDualCameraPreview
La prueba testDualCameraPreview
no configura sesiones solo después de abrirlas.
todas las cámaras. Sigue esta secuencia:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
Sin embargo, sí tolera fallas abiertas de la cámara
ERROR_MAX_CAMERAS_IN_USE [1]
Las apps de terceros pueden depender de este comportamiento.
Porque la HAL de la cámara no sabrá el conjunto completo de IDs de cámara que se están abriendo para las operaciones simultáneas antes de configurar las sesiones, podría ser difícil asignar recursos de hardware (suponiendo que hay competencia por ellos).
Para resolver este problema, mantener la retrocompatibilidad además de
admitir transmisiones simultáneas, las HAL de la cámara deberían fallar las llamadas de openCamera
con
ERROR_MAX_CAMERAS_IN_USE
si no puede admitir la configuración de transmisión completa para
que todas las cámaras funcionen simultáneamente.