Android consente ai dispositivi di supportare lo streaming simultaneo di dispositivi con videocamera. Per Ad esempio, su un dispositivo sono in funzione sia la fotocamera anteriore che quella posteriore contemporaneamente. Da Android 11, l'API Camera2 include i seguenti metodi che le app possono chiamare per stabilire se le videocamere supportano lo streaming simultaneo e le configurazioni di stream supportate.
getConcurrentCameraIds
: Ottiene l'insieme di combinazioni del dispositivo con videocamera attualmente connesso identificatori che supportano contemporaneamente la configurazione di sessioni dispositivo della 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 obbligatorie che devono essere supportate in parallelo
i live streaming sono inclusi attraverso le caratteristiche della videocamera di un dispositivo videocamera nella
SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
proprietà.
Ogni dispositivo videocamera pubblicizzato tramite getConcurrentStreamingCameraIds()
deve supportare le seguenti configurazioni garantite per gli stream simultanei.
Target 1 | Target 2 | |||
---|---|---|---|---|
Digitazione | Dimensione massima | Digitazione | Dimensioni massime | Esempi di casi d'uso |
YUV | S1440 p | Elaborazione di immagini o video in-app | ||
PRIV | s1440p | Analisi del mirino nell'app | ||
JPEG | s1440p | Acquisizione di immagini fisse non tramite mirino | ||
YUV / PRIV | S720p | JPEG | s1440p | Immagini fisse standard |
YUV / PRIV | S720p | YUV / PRIV | S1440 p | Video in-app o elaborazione con anteprima |
Dispositivi con la funzionalità MONOCHROME
(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
)
include
CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
)
il supporto Y8 deve supportare la sostituzione degli stream YUV con Y8 in tutte le
combinazioni di stream.
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
al formato particolare restituito
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
Consentire alle app di interrogare un dispositivo per determinare se si tratta
le videocamere supportano lo streaming simultaneo, implementano
ICameraProvider@2.6
Interfaccia HAL, che include i seguenti metodi:
Per un'implementazione di riferimento dell'interfaccia ICameraProvider@2.6
HAL, consulta
la libreria HAL della videocamera emulata su
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 delle videocamere pubblicizzano il supporto del funzionamento simultaneo di con le videocamere, potrebbero verificarsi problemi di allocazione delle risorse, soprattutto nel caso in cui le risorse del processore di segnale (ISP) di immagine sulla rete uno smartphone per riprodurre in streaming contemporaneamente le fotocamere anteriori e posteriori (o di altro tipo), ma non la capacità massima. In questo caso, l'HAL della fotocamera deve allocare risorse hardware limitate a ogni dispositivo della fotocamera.
Scenario di esempio
Lo scenario seguente illustra 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 utilizza una risorsa ISP.
Il dispositivo (smartphone) ha due ISP. Se l'ID videocamera 0
è aperto e viene una sessione
è possibile che l'HAL della videocamera prenoti due ISP che
per la fotocamera ultrawide e grandangolare.
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 fotocamera 0
che 1
prima di configurare le sessioni per fornire un suggerimento all'HAL della videocamera 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, la videocamera deve aprire i dispositivi fotocamera (
@3.2::ICameraDevice::open
) prima configurando eventuali sessioni sui dispositivi con videocamera. In questo modo, i fornitori di servizi di fotocamere possono allocare le risorse di conseguenza.Per risolvere il problema dell'impossibilità di gestire rapporto intervallo di zoom, assicurati che le app della fotocamera, quando utilizzi fotocamere contemporaneamente, l'uso dell'impostazione di controllo
ZOOM_RATIO
tra solo 1x eMAX_DIGITAL_ZOOM
invece deiZOOM_RATIO_RANGE
completi (questo impedisce il passaggio dalle fotocamere fisiche all'interno, cosa che 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 l'apertura
tutte le videocamere. Segue questa sequenza:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
Tuttavia, tollera errori di apertura della videocamera con
ERROR_MAX_CAMERAS_IN_USE [1]
. Le app di terze parti potrebbero dipendere da questo comportamento.
Perché l'HAL della videocamera non riconosce l'insieme completo di ID videocamera da aprire per le operazioni simultanee prima di configurare le sessioni, allocano risorse hardware (ammesso che vi sia concorrenza tra loro).
Per risolvere questo problema, mantenendo la compatibilità con le versioni precedenti, oltre a
che supporta lo streaming simultaneo, gli HAL della videocamera non dovrebbero riuscire openCamera
chiamate con
ERROR_MAX_CAMERAS_IN_USE
se non supporta la configurazione dello stream completo per
tutte le videocamere in esecuzione contemporaneamente.