Android consente ai dispositivi di supportare lo streaming simultaneo di dispositivi con videocamera. Ad esempio, consente a un dispositivo di avere contemporaneamente in funzione sia la fotocamera anteriore che quella posteriore. A partire da Android 11, l'API Camera2 include i seguenti metodi che le app possono chiamare per determinare se le videocamere supportano lo streaming simultaneo e le configurazioni di stream supportate.
getConcurrentCameraIds
: recupera l'insieme di combinazioni di identificatori dei dispositivi con videocamera attualmente connessi che supportano la configurazione simultanea di sessioni dei dispositivi videocamera.isConcurrentSessionConfigurationSupported
: controlla se l'insieme di dispositivi di fotocamere fornito e le relative configurazioni di sessione possono essere configurati contemporaneamente.
Un insieme di combinazioni di stream obbligatori che devono essere supportate durante lo streaming
simultaneo viene incluso tramite le caratteristiche della videocamera della videocamera nella proprietà
SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
.
Ogni dispositivo videocamera pubblicizzato tramite getConcurrentStreamingCameraIds()
deve supportare le seguenti configurazioni garantite per gli stream simultanei.
Target 1 | Target 2 | |||
---|---|---|---|---|
Digitazione | Dimensioni massime | Digitazione | Dimensioni massime | Esempi di casi d'uso |
YUV | s1440p | Elaborazione di immagini o video in-app | ||
PRIV | S1440 p | Analisi del mirino nell'app | ||
JPEG | S1440 p | Acquisizione di immagini fisse non tramite mirino | ||
YUV / PRIV | s720p | JPEG | S1440 p | Immagini fisse standard |
YUV / PRIV | s720p | YUV / PRIV | s1440p | Video in-app o elaborazione con anteprima |
I dispositivi con la funzionalità MONOCHROME
(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
include
CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
)
che supporta Y8 devono supportare la sostituzione degli stream YUV con Y8 in tutte le combinazioni di stream garantiti.
s720p
si riferisce a 720p (1280 x 720) o alla risoluzione massima supportata per il
particolar formato restituito da
StreamConfigurationMap.getOutputSizes()
.
s1440p
si riferisce a 1440p (1920 x 1440) o alla risoluzione massima supportata per
il formato specifico restituito da
StreamConfigurationMap.getOutputSizes()
.
I dispositivi le cui funzionalità non includono
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
devono supportare almeno un singolo stream Y16, Dataspace::DEPTH
con risoluzione sVGA, durante il funzionamento simultaneo, dove sVGA è la più piccola delle due
seguenti risoluzioni:
- Risoluzione massima in uscita per il formato specificato
- 640 x 480
Implementazione
Per consentire alle app di eseguire query su un dispositivo per determinare se le sue videocamere supportano lo streaming simultaneo, implementa l'interfaccia HAL ICameraProvider@2.6
, che include i seguenti metodi:
Per un'implementazione di riferimento dell'interfaccia ICameraProvider@2.6
HAL, consulta la libreria HAL della fotocamera emulata all'indirizzo
EmulatedCameraProviderHWLImpl.cpp
.
Convalida
Per verificare che l'implementazione di questa funzionalità funzioni come previsto, utilizza il
ConcurrentCameraTest.java
test CTS. Inoltre, esegui un test utilizzando un'app che apre più fotocamere e le aziona contemporaneamente.
Problemi di allocazione delle risorse
Se gli HAL della fotocamera pubblicizzano il supporto per il funzionamento simultaneo dei dispositivi di fotografia, potrebbero verificarsi problemi di allocazione delle risorse, in particolare se sullo smartphone sono presenti risorse ISP (Image Signal Processor) sufficienti per lo streaming contemporaneamente delle fotocamere anteriore e posteriore (o altre), ma non per la loro piena capacità. In questo caso, l'HAL della videocamera deve allocare risorse hardware limitate a ogni dispositivo della videocamera.
Scenario di esempio
Lo scenario seguente illustra questo problema.
Problema
Il dispositivo ha la seguente configurazione:
- L'ID fotocamera
0
è una videocamera logica supportata da una fotocamera grandangolare e ultrawide, ciascuna delle quali prende una risorsa ISP. - L'ID videocamera
1
è una videocamera che occupa una risorsa ISP.
Il dispositivo (smartphone) ha due ISP. Se l'ID videocamera 0
è aperto ed è configurata una sessione, è possibile che l'HAL della videocamera riservi due ISP in previsione dell'utilizzo sia della videocamera ultrawide che di quella ampia.
In questo caso, la videocamera anteriore (ID 1
) non può configurare alcun stream perché sono in uso entrambi gli ISP.
Soluzione
Per risolvere questo problema, il framework può aprire sia gli ID videocamera 0
che 1
prima di configurare le sessioni per fornire un suggerimento all'HAL della fotocamera su come allocare le risorse (perché ora prevede il funzionamento simultaneo delle videocamere).
Tuttavia, ciò può comportare funzionalità limitate, ad esempio lo zoom potrebbe non essere in grado di gestire il rapporto completo dell'intervallo di zoom (poiché la modifica degli ID delle fotocamere fisiche potrebbe essere problematica).
Per implementare questa soluzione, apporta i seguenti aggiornamenti a
provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
.
Obbliga che, per il funzionamento simultaneo delle videocamere, il telaio della videocamera deve aprire i dispositivi videocamera (
@3.2::ICameraDevice::open
) prima di configurare qualsiasi sessione sui dispositivi. In questo modo, i fornitori di servizi di fotocamere possono allocare le risorse di conseguenza.Per risolvere il problema della mancata gestione dell'intera gamma di zoom, assicurati che le app della fotocamera, quando utilizzi le fotocamere contemporaneamente, utilizzino l'impostazione di controllo
ZOOM_RATIO
solo tra 1x eMAX_DIGITAL_ZOOM
anzichéZOOM_RATIO_RANGE
completo (in questo modo viene impedito il passaggio interno delle videocamere fisiche, il che potrebbe richiedere più ISP).
Problema con testDualCameraPreview
Se apporti gli aggiornamenti precedenti, potresti creare un problema con un comportamento consentito dal test MultiViewTest.java#testDualCameraPreview
.
Il test testDualCameraPreview
non configura le sessioni solo dopo aver aperto
tutte le videocamere. Segue questa sequenza:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
Tuttavia, tollera gli errori di apertura della fotocamera con
ERROR_MAX_CAMERAS_IN_USE [1]
. Le app di terze parti potrebbero dipendere da questo comportamento.
Poiché l'HAL della videocamera non conoscerà il set completo di ID videocamera aperti per l'operazione simultanea prima di configurare le sessioni, potrebbe essere difficile per l'HAL allocare le risorse hardware (supponendo che ci sia una certa concorrenza per queste risorse).
Per risolvere questo problema, mantenendo la compatibilità con le versioni precedenti, oltre a supportare lo streaming simultaneo, le HAL della videocamera devono interrompere le chiamate openCamera
con ERROR_MAX_CAMERAS_IN_USE
se non possono supportare la configurazione completa dello stream per tutte le videocamere in esecuzione contemporaneamente.