Android permet aux appareils de prendre en charge le streaming simultané des caméras. Pour par exemple, cela permet à un appareil de faire fonctionner à la fois les caméras avant et arrière en même temps. Sous Android 11, l'API Camera2 inclut les méthodes suivantes : que les applications peuvent appeler pour déterminer si les caméras prennent en charge les diffusions simultanées et les configurations de flux compatibles.
getConcurrentCameraIds
: Récupère l'ensemble des combinaisons de l'appareil photo actuellement connecté. permettant de configurer simultanément des sessions de caméra/appareil 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 caméra annoncée via getConcurrentStreamingCameraIds()
doit
acceptent 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 | Pas de capture d'image fixe avec le viseur | ||
YUV / PRIV | S720p | JPEG | S1440p | Imagerie fixe standard |
YUV / PRIV | S720p | YUV / PRIV | S1440p | Vidéo ou traitement dans l'application 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 acceptée 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 tester l'implémentation de cette fonctionnalité comme prévu, utilisez la
ConcurrentCameraTest.java
Test CTS Effectuez également le test à l'aide d'une application qui ouvre plusieurs caméras et fonctionne
simultanément.
Problèmes d'allocation des ressources
Si les HAL des caméras annoncent la prise en charge du fonctionnement simultané de ils peuvent rencontrer des problèmes d'allocation des ressources, en particulier lorsqu'il y a suffisamment de ressources de processeur de signal d'image (FAI) sur le téléphone pour diffuser simultanément le flux des caméras avant et arrière (ou d'autres), mais pas pour à 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
La configuration de l'appareil est la 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 accepte 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 de ne pas pouvoir gérer l'intégralité rapport de zoom, assurez-vous que les applications d'appareil photo, lorsque vous les utilisez simultanément, sont assurés d'utiliser le paramètre de commande
ZOOM_RATIO
entre seulement 1x etMAX_DIGITAL_ZOOM
au lieu duZOOM_RATIO_RANGE
complet (ce empêche le basculement des caméras physiques en interne, ce qui peut nécessite davantage de FAI).
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
.
L'testDualCameraPreview
de test ne configure pas les sessions uniquement après l'ouverture
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, maintenir la rétrocompatibilité en plus
prenant en charge les flux simultanés, les HAL des caméras doivent échouer aux appels openCamera
avec
ERROR_MAX_CAMERAS_IN_USE
s'ils ne peuvent pas prendre en charge la configuration de flux complet pour
toutes les caméras fonctionnant en même temps.