Streaming della videocamera simultaneo

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.6HAL, 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 e MAX_DIGITAL_ZOOM invece dei ZOOM_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.