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 sia 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 dello stream supportate.
getConcurrentCameraIds
: recupera l'insieme di combinazioni di identificatori dei dispositivi di fotocamera attualmente connessi che supportano la configurazione delle sessioni dei dispositivi di fotocamera contemporaneamente.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 obbligatorie che devono essere supportate durante lo streaming simultaneo sono incluse tramite le caratteristiche della videocamera di un dispositivo 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 video o immagini in-app | ||
PRIV | s1440p | Analisi del mirino in-app | ||
JPEG | s1440p | Nessuna acquisizione di immagini fisse dal mirino | ||
YUV / PRIV | s720p | JPEG | s1440p | 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 supportano Y8 devono supportare la sostituzione degli stream YUV con Y8 in tutte le combinazioni di stream garantite.
s720p
si riferisce a 720p (1280 x 720) o alla risoluzione massima supportata per il particolare formato 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
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 il test utilizzando un'app che apra più videocamere e le gestisca contemporaneamente.
Problemi di allocazione delle risorse
Se gli HAL della fotocamera pubblicizzano il supporto per il funzionamento simultaneo dei dispositivi della fotocamera, 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 alla loro piena capacità. In questo caso, l'HAL della videocamera deve allocare risorse hardware limitate a ogni dispositivo.
Scenario di esempio
Il seguente scenario dimostra questo problema.
Problema
Il dispositivo ha la seguente configurazione:
- L'ID fotocamera
0
è una fotocamera logica supportata da una fotocamera grandangolare e una ultrawide, ciascuna delle quali occupa 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 entrambi gli ID videocamera 0
e 1
prima di configurare le sessioni per fornire un suggerimento all'HAL della videocamera su come
allocare le risorse (in quanto 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
.
Imposta che, per il funzionamento simultaneo delle videocamere, il framework della videocamera debba aprire i dispositivi della videocamera (
@3.2::ICameraDevice::open
) prima di configurare eventuali sessioni sui dispositivi della videocamera. 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 si impedisce il passaggio delle videocamere fisiche internamente, il che potenzialmente richiede 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.