Android consente ai dispositivi di supportare lo streaming simultaneo di videocamere. Ad esempio, ciò consente a un dispositivo di far funzionare contemporaneamente le fotocamere anteriore e 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 streaming supportate.
getConcurrentCameraIds
: Recupera l'insieme di combinazioni di identificatori di dispositivi videocamera attualmente connessi che supportano la configurazione simultanea delle sessioni dei dispositivi videocamera.isConcurrentSessionConfigurationSupported
: Controlla se il set fornito di dispositivi di ripresa e le relative configurazioni di sessione possono essere configurati contemporaneamente.
Un insieme di combinazioni di stream obbligatorie che devono essere supportate durante lo streaming simultaneo sono incluse tramite le caratteristiche della videocamera di un dispositivo 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 | |||
---|---|---|---|---|
Tipo | Dimensione massima | Tipo | Dimensione massima | Esempi di casi d'uso |
YUV | s1440p | Elaborazione di video o immagini in-app | ||
PRIV | s1440p | Analisi del mirino in-app | ||
JPEG | s1440p | Nessuna acquisizione di immagini fisse nel mirino | ||
YUV / PRIV | s720p | JPEG | s1440p | Immagini statiche standard |
YUV / PRIV | s720p | YUV / PRIV | s1440p | Video in-app o elaborazione con anteprima |
I dispositivi con funzionalità MONOCHROME
(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
include
CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
)
che supportano Y8 devono supportare la sostituzione dei flussi YUV con Y8 in tutte le combinazioni di flussi garantite.
s720p
si riferisce a 720p (1280 x 720) o alla risoluzione massima supportata per il
formato specifico restituito da
StreamConfigurationMap.getOutputSizes()
.
s1440p
si riferisce a 1440p (1920 x 1440) o alla risoluzione massima supportata per
il particolare formato 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
risoluzioni seguenti:
- risoluzione di output massima per il formato specificato
- 640 x 480
Implementazione
Per consentire alle app di eseguire query su un dispositivo per determinare se le sue
fotocamere supportano lo streaming simultaneo, implementa l'interfaccia
HAL ICameraProvider@2.6
, che include i seguenti metodi:
Per un'implementazione di riferimento dell'interfaccia HAL ICameraProvider@2.6
, consulta
la libreria HAL della videocamera emulata all'indirizzo
EmulatedCameraProviderHWLImpl.cpp
.
Convalida
Per verificare che l'implementazione di questa funzionalità funzioni come previsto, utilizza il test CTS
ConcurrentCameraTest.java
. Inoltre, esegui il test utilizzando un'app che apre più videocamere e le gestisce
contemporaneamente.
Problemi di allocazione delle risorse
Se gli HAL della fotocamera annunciano il supporto del funzionamento simultaneo dei dispositivi della fotocamera, potrebbero riscontrare problemi di allocazione delle risorse, soprattutto nel caso in cui sullo smartphone siano presenti risorse ISP (Image Signal Processor) sufficienti per trasmettere in streaming contemporaneamente le fotocamere anteriore e posteriore (o altre), ma non alla loro piena capacità. In questo caso, l'HAL della fotocamera deve allocare risorse hardware limitate a ogni dispositivo fotocamera.
Scenario di esempio
Il seguente scenario mostra questo problema.
Problema
Il dispositivo ha la seguente configurazione:
- L'ID fotocamera
0
è una fotocamera logica supportata da una fotocamera grandangolare e una ultrawide, ognuna delle quali utilizza una risorsa ISP. - L'ID fotocamera
1
è una fotocamera che utilizza una risorsa ISP.
Il dispositivo (smartphone) ha due ISP. Se viene aperto l'ID videocamera 0
e viene configurata una sessione, è possibile che l'HAL della videocamera riservi due ISP prevedendo l'utilizzo sia della videocamera ultrawide che di quella grandangolare.
In questo caso, la videocamera anteriore (ID 1
) non può configurare nessuno
stream perché entrambi i provider di servizi internet sono in uso.
Soluzione
Per risolvere questo problema, il framework può aprire entrambi gli ID fotocamera 0
e 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 fotocamere).
Tuttavia, ciò può comportare funzionalità limitate, ad esempio lo zoom potrebbe non essere
in grado di gestire l'intero rapporto di zoom (perché il cambio degli ID fotocamera fisici
potrebbe essere problematico).
Per implementare questa soluzione, apporta i seguenti aggiornamenti a
provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
.
Stabilisci che per il funzionamento simultaneo delle videocamere, il framework della videocamera deve aprire i dispositivi videocamera (
@3.2::ICameraDevice::open
) prima di configurare qualsiasi sessione sui dispositivi videocamera. In questo modo, i fornitori di videocamere possono allocare le risorse di conseguenza.Per risolvere il problema dell'impossibilità di gestire l'intero rapporto di zoom, assicurati che le app della videocamera, quando utilizzano le videocamere contemporaneamente, garantiscano l'utilizzo dell'impostazione di controllo
ZOOM_RATIO
solo tra 1x eMAX_DIGITAL_ZOOM
anziché l'interoZOOM_RATIO_RANGE
(in questo modo si impedisce il passaggio interno tra le videocamere fisiche, il che potenzialmente richiede più ISP).
Problema con testDualCameraPreview
Quando apporti gli aggiornamenti sopra indicati, può verificarsi un problema con un comportamento consentito
dal test MultiViewTest.java#testDualCameraPreview
.
Il test testDualCameraPreview
non configura le sessioni solo dopo l'apertura
di tutte le videocamere. Segue questa sequenza:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
Tuttavia, tollera gli errori di apertura della videocamera con
ERROR_MAX_CAMERAS_IN_USE [1]
. Le app di terze parti potrebbero dipendere da questo comportamento.
Poiché l'HAL della videocamera non conoscerà l'insieme completo di ID videocamera aperti per il funzionamento simultaneo prima di configurare le sessioni, potrebbe essere difficile allocare le risorse hardware (supponendo che ci sia una certa concorrenza per queste).
Per risolvere questo problema, mantenendo la compatibilità con le versioni precedenti e supportando lo streaming simultaneo, le HAL della videocamera devono restituire errori alle chiamate openCamera
con ERROR_MAX_CAMERAS_IN_USE
se non riescono a supportare la configurazione completa dello stream per tutte le videocamere in esecuzione contemporaneamente.