Android permite que los dispositivos admitan la transmisión simultánea de dispositivos de cámara. Para Por ejemplo, esto permite que un dispositivo funcione tanto con la cámara frontal como la posterior al mismo tiempo. A partir de Android 11, la API de Camera2 incluye los siguientes métodos a las que las aplicaciones pueden llamar para determinar si las cámaras admiten transmisiones concurrentes 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
: Verifica si el conjunto proporcionado de dispositivos de cámara y sus configuraciones de sesión correspondientes se pueden configurar 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 anunciado a través de getConcurrentStreamingCameraIds()
debe admitir las siguientes configuraciones garantizadas para transmisiones simultáneas.
Objetivo 1 | Objetivo 2 | |||
---|---|---|---|---|
Tipo | Tamaño máximo | Tipo | Tamaño máximo | Ejemplos de casos de uso |
YUV | s1440p | Procesamiento de imágenes o video en la app | ||
PRIV. | s1440p | Análisis del visor integrado en la app | ||
JPEG | s1440p | Sin captura de imágenes fijas en el visor | ||
YUV / PRIV | S720p | JPEG | S1440p | Imágenes fijas estándar |
YUV/PRIV | S720p | YUV / PRIV | S1440p | Video integrado 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 y determinen si sus cámaras admiten la transmisión simultánea, implementa la interfaz de HAL de ICameraProvider@2.6
, que incluye los siguientes métodos:
Para obtener una implementación de referencia de la interfaz de HAL de ICameraProvider@2.6
, 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 funcione según lo previsto, usa la prueba de CTS de ConcurrentCameraTest.java
. Además, prueba con una app que abra varias cámaras y opere
de forma simultánea.
Problemas con las asignaciones de recursos
Si los HAL de la cámara anuncian compatibilidad con el funcionamiento simultáneo de los dispositivos de cámara, es posible que se produzcan problemas de asignación de recursos, en especial, si hay suficientes recursos de procesador de señal de imagen (ISP) en el teléfono para transmitir cámaras frontal y posterior (o alguna otra) de forma simultánea, pero no a su máxima capacidad. En este caso, la HAL de la cámara debe asignar limitaciones 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 una cámara gran angular y ultra gran angular, que toman un recurso de ISP cada una. - El ID de cámara
1
es una cámara que toma un recurso del ISP.
El dispositivo (teléfono) tiene dos ISP. Si se abre el ID de la cámara 0
y se configura una sesión, es posible que el HAL de la cámara reserve dos ISP anticipando el uso de la cámara ultraancha y ancha.
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 generar capacidades limitadas, por ejemplo, es posible que el zoom no pueda controlar la relación completa del rango de zoom (porque cambiar los IDs de la cámara física puede ser problemático).
Para implementar esta solución, realiza las siguientes actualizaciones en provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
.
Establece que, para el funcionamiento simultáneo de las cámaras, el framework de la cámara debe abrir los dispositivos de cámara (
@3.2::ICameraDevice::open
) antes de configurar cualquier sesión en ellos. Esto permite que los proveedores de cámaras asignen recursos según corresponda.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]
Es posible que las apps de terceros dependan de este comportamiento.
Como el HAL de la cámara no conocerá el conjunto completo de IDs de cámara que se abrirán para la operación simultánea antes de configurar las sesiones, podría ser difícil asignar recursos de hardware (suponiendo que haya cierta 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.