Android permet aux appareils de prendre en charge le streaming simultané des caméras. Par exemple, cela permet à un appareil d'utiliser simultanément la caméra avant et la caméra arrière. À partir d'Android 11, l'API Camera2 inclut les méthodes suivantes que les applications peuvent appeler pour déterminer si les caméras sont compatibles avec la diffusion simultanée et les configurations de flux compatibles.
getConcurrentCameraIds
: obtient l'ensemble des combinaisons d'identifiants d'appareils photo actuellement connectés qui permettent de configurer simultanément des sessions d'appareils photo.isConcurrentSessionConfigurationSupported
: Vérifie si l'ensemble de caméras fourni et les les configurations de session peuvent être configurées simultanément.
Un ensemble de combinaisons de flux obligatoires qui doivent être acceptées lors de la diffusion simultanée
sont incluses dans les caractéristiques de la caméra d'une caméra
SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
.
Chaque appareil photo annoncé via getConcurrentStreamingCameraIds()
doit prendre en charge les configurations garanties suivantes pour les flux simultanés.
Cible 1 | Cible 2 | |||
---|---|---|---|---|
Type | Taille maximale | Type | Taille maximale | Exemples de cas d'utilisation |
YUV | s1440p | Traitement des vidéos ou des images dans l'application | ||
PRIV | S1440p | Analyse du viseur dans l'application | ||
JPEG | S1440p | Impossible de prendre une photo avec l'appareil photo | ||
YUV / PRIV | s720p | JPEG | S1440p | Imagerie fixe standard |
YUV/PRIV | S720p | YUV / PRIV | s1440p | Vidéo dans l'application ou traitement avec aperçu |
Appareils ayant la capacité MONOCHROME
(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
).
inclut
CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
).
la prise en charge de Y8 doit pouvoir remplacer les flux YUV par Y8 dans tous les cas
des combinaisons de flux.
s720p
fait référence à 720p (1 280 x 720) ou à la résolution maximale acceptée pour
format particulier renvoyé par
StreamConfigurationMap.getOutputSizes()
s1440p
fait référence à 1440p (1 920 x 1 440) ou à la résolution maximale prise en charge pour le format particulier renvoyé par StreamConfigurationMap.getOutputSizes()
.
Appareils dont les fonctionnalités n'incluent pas les fonctionnalités suivantes :
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
doit accepter au moins un flux Y16, Dataspace::DEPTH
avec sVGA
lors d'opérations simultanées, où sVGA est le plus petit des deux
les résolutions suivantes:
- résolution de sortie maximale pour le format donné
- 640 x 480
Implémentation
Pour permettre aux applications d'interroger un appareil pour déterminer
sont compatibles avec les flux simultanés, mettez en œuvre
ICameraProvider@2.6
Interface HAL, qui comprend les méthodes suivantes:
Pour obtenir une implémentation de référence de l'interface ICameraProvider@2.6
HAL, consultez
la bibliothèque HAL de la caméra émulée
EmulatedCameraProviderHWLImpl.cpp
Validation
Pour vérifier que votre implémentation de cette fonctionnalité fonctionne comme prévu, utilisez le test CTS ConcurrentCameraTest.java
. Testez également à l'aide d'une application qui ouvre plusieurs caméras et les fait fonctionner simultanément.
Problèmes d'allocation de ressources
Si les HAL de l'appareil photo annoncent la prise en charge du fonctionnement simultané des appareils photo, ils peuvent rencontrer des problèmes d'allocation de ressources, en particulier s'il existe suffisamment de ressources de processeur de signal d'image (ISP) sur le téléphone pour diffuser simultanément les caméras avant et arrière (ou d'autres), mais pas à leur pleine capacité. Dans ce cas, l'HAL de la caméra doit allouer des ressources ressources matérielles spécifiques à chaque appareil photo.
Exemple de scénario
Le scénario suivant illustre ce problème.
Problème
L'appareil présente la configuration suivante :
- L'ID de l'appareil photo
0
est un appareil photo logique doté d'un objectif grand angle et d'un ultra grand angle caméra, qui utilisent chacun une ressource FAI. - L'ID d'appareil photo
1
est un appareil photo qui utilise une ressource FAI.
L'appareil (téléphone) est associé à deux FAI. Si l'ID d'appareil photo 0
est ouvert et qu'une session est
il est possible que le HAL de la caméra réserve deux FAI
à la fois l'objectif ultra grand angle
et l'appareil photo grand angle.
Dans ce cas, sachez que la caméra avant (ID 1
) ne peut pas en configurer
flux car les deux FAI sont utilisés.
Solution
Pour résoudre ce problème, le framework peut ouvrir les ID d'appareil photo 0
et 1
.
avant de configurer des sessions pour indiquer au HAL de la caméra comment
alloue des ressources (car il attend désormais un fonctionnement simultané des caméras).
Toutefois, cela peut limiter les capacités, par exemple, le zoom n'est pas
gérer tout le ratio de la plage de zoom (car le fait de changer d'appareil photo
les identifiants peuvent poser problème).
Pour implémenter cette solution, effectuez les mises à jour suivantes dans
provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
exiger que, pour le fonctionnement simultané des caméras, le framework doit ouvrir les appareils photo (
@3.2::ICameraDevice::open
) avant la configuration des sessions sur les caméras. Cela permet à l'appareil photo d'allouer les ressources en conséquence.Pour résoudre le problème d'impossibilité de gérer le rapport de la plage de zoom complète, assurez-vous que les applications d'appareil photo, lorsqu'elles utilisent des appareils photo simultanément, utilisent le paramètre de commande
ZOOM_RATIO
entre 1x etMAX_DIGITAL_ZOOM
uniquement au lieu deZOOM_RATIO_RANGE
complet (cela empêche le basculement des caméras physiques en interne, ce qui nécessite potentiellement plus d'ISP).
Problème avec testDualCameraPreview
Les mises à jour ci-dessus peuvent entraîner un problème avec un comportement autorisé.
par le test MultiViewTest.java#testDualCameraPreview
.
Le test testDualCameraPreview
ne configure pas les sessions qu'après avoir ouvert toutes les caméras. Elle se déroule comme suit:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
En revanche, il tolère les défaillances d'ouverture de l'appareil photo
ERROR_MAX_CAMERAS_IN_USE [1]
Les applications tierces peuvent dépendre de ce comportement.
Parce que l'HAL de la caméra ne sait pas que tous les ID de caméra sont ouverts pour des opérations simultanées avant de configurer des sessions, il peut être difficile de allouent des ressources matérielles (en supposant qu'elles soient mises en concurrence).
Pour résoudre ce problème, tout en conservant la rétrocompatibilité et en prenant en charge le streaming simultané, les HAL de l'appareil photo doivent échouer les appels openCamera
avec ERROR_MAX_CAMERAS_IN_USE
s'ils ne sont pas compatibles avec la configuration complète du flux pour toutes les caméras exécutées simultanément.