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 della videocamera.isConcurrentSessionConfigurationSupported
: Controlla se il set di fotocamere fornito e i relativi dispositivi configurazioni di sessione possono essere configurate 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 videocamera pubblicizzato tramite getConcurrentStreamingCameraIds()
deve
supportano le seguenti configurazioni garantite per stream simultanei.
Obiettivo 1 | Obiettivo 2 | |||
---|---|---|---|---|
Tipo | Dimensione massima | Tipo | Dimensione massima | Esempi di casi d'uso |
YUV | S1440 p | 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 | Immagine statica standard |
YUV / PRIV | S720p | YUV / PRIV | S1440 p | Elaborazione o video in-app 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
formato particolare restituito
StreamConfigurationMap.getOutputSizes()
s1440p
si riferisce a 1440p (1920 x 1440) o alla risoluzione massima supportata per
al formato particolare restituito
StreamConfigurationMap.getOutputSizes()
Dispositivi le cui funzionalità non includono
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
deve supportare almeno un singolo stream Y16, Dataspace::DEPTH
con sVGA
durante operazioni simultanee, dove sVGA è il più piccolo dei due
risoluzioni riportate di seguito:
- risoluzione massima di output 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 la
ConcurrentCameraTest.java
Test CTS. Inoltre, esegui un test utilizzando un'app che apre più fotocamere e funziona
contemporaneamente.
Problemi di allocazione delle risorse
Se gli HAL delle videocamere pubblicizzano il supporto del funzionamento simultaneo di con videocamere, questi possono causare problemi di allocazione delle risorse, soprattutto nel caso in cui le risorse del processore di segnale (ISP) di immagine sulla uno smartphone per riprodurre in streaming contemporaneamente le fotocamere anteriori e posteriori (o di altro tipo), ma non la capacità massima. In questo caso, la videocamera HAL deve assegnare a ogni dispositivo videocamera.
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 ultrawide ciascuna delle quali prende 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 avviata una sessione
è possibile che l'HAL della videocamera prenoti due ISP che
per la fotocamera ultrawide e grandangolare.
In questo caso, la fotocamera anteriore (ID 1
) non può configurare nessuna
poiché entrambi gli ISP sono in uso.
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, questo può limitare le funzionalità, ad esempio, lo zoom potrebbe non essere
in grado di gestire il rapporto di zoom completo (perché il passaggio da una fotocamera fisica all'altra
gli ID potrebbero essere problematici).
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 la fotocamera di 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 supportano la configurazione dello stream completo per
tutte le videocamere in esecuzione contemporaneamente.