Streaming simultaneo della videocamera

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.6HAL, 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 e MAX_DIGITAL_ZOOM invece dei ZOOM_RATIO_RANGE completi (questo impedisce il passaggio dalle fotocamere fisiche all'interno, cosa che richiede più ISP).

di Gemini Advanced.

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.