Streaming simultaneo della videocamera

Android consente ai dispositivi di supportare lo streaming simultaneo di dispositivi con fotocamera. Ad esempio, ciò consente a un dispositivo di far funzionare contemporaneamente sia la fotocamera anteriore che quella posteriore. Da Android 11, l'API Camera2 include i seguenti metodi che le app possono chiamare per determinare se le telecamere supportano lo streaming simultaneo e le configurazioni di streaming supportate.

  • getConcurrentStreamingCameraIds : Ottiene l'insieme di combinazioni di identificatori di dispositivo telecamera attualmente collegati che supportano la configurazione del dispositivo sessioni telecamera contemporaneamente.
  • isConcurrentSessionConfigurationSupported : verifica se l'insieme disponibile di dispositivi telecamere ei corrispondenti configurazioni di sessione può essere configurato in concomitanza.

Un insieme di combinazioni flusso obbligatorie che deve essere supportata durante lo streaming simultaneo sono inclusi attraverso le caratteristiche della fotocamera di un dispositivo fotocamera nel SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS struttura.

Ogni dispositivo fotocamera pubblicizzato attraverso getConcurrentStreamingCameraIds() deve supportare le seguenti configurazioni garantiti flussi simultanei.

Obiettivo 1 Obiettivo 2
Tipo Dimensione massima Tipo Dimensione massima Esempi di casi d'uso
YUV s1440p Elaborazione di video o immagini in-app
PRIVATO s1440p Analisi del mirino in-app
JPEG s1440p Nessuna acquisizione di immagini fisse nel 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 il MONOCHROME capacità ( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES include CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME ) supportante Y8 deve supportare sostituendo YUV flussi con Y8 in tutte le combinazioni flusso garantite.

s720p riferisce a 720p (1280 x 720) o la risoluzione massima supportata per il particolare formato restituito da StreamConfigurationMap.getOutputSizes() . s1440p riferisce a 1440p (1920 x 1440) o la risoluzione massima supportata per il particolare formato restituito da StreamConfigurationMap.getOutputSizes() . Dispositivi i cui capacità non includono ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE deve supportare almeno un singolo flusso Y16, Dataspace::DEPTH con risoluzione SVGA, durante funzionamento in parallelo, dove svga è la più piccola delle due seguenti soluzioni:

  • risoluzione di output massima per il formato dato
  • 640 x 480

Implementazione

Per consentire applicazioni per interrogare un dispositivo per determinare se le sue telecamere supportano lo streaming simultaneo, implementare l' ICameraProvider@2.6 interfaccia HAL, che comprende i seguenti metodi:

Per un'implementazione di riferimento della ICameraProvider@2.6 interfaccia di HAL, consultare la biblioteca HAL fotocamera emulato a EmulatedCameraProviderHWLImpl.cpp .

Convalida

Per verificare che l'implementazione di questa funzionalità funziona come previsto, utilizzare il ConcurrentCameraTest.java test di CTS. Inoltre, prova utilizzando un'app che apre più telecamere e le fa funzionare contemporaneamente.

Problemi di allocazione delle risorse

Se gli HAL della fotocamera pubblicizzano il supporto per il funzionamento simultaneo dei dispositivi della fotocamera, potrebbero incorrere in problemi di allocazione delle risorse, specialmente nel caso in cui ci siano abbastanza risorse del processore del segnale di immagine (ISP) sul telefono per trasmettere contemporaneamente sia le fotocamere anteriori che quelle posteriori (o altre) , ma non alla loro piena capacità. In questo caso, l'HAL della telecamera deve allocare risorse hardware limitate a ciascun dispositivo della telecamera.

Scenario di esempio

Il seguente scenario illustra questo problema.

Problema

Il dispositivo ha la seguente configurazione:

  • Camera ID 0 è una telecamera logica sostenuta da una macchina fotografica larga e ultra larga-, che ciascun take una risorsa ISP.
  • Camera ID 1 è una fotocamera che prende una risorsa ISP.

Il dispositivo (telefono) dispone di due ISP. Se la telecamera ID 0 è aperta e una sessione è configurato, è possibile che le riserve fotocamera HAL due ISP anticipando sia ultrawide e l'uso della macchina fotografica di larghezza.

Se questo è il caso, la fotocamera anteriore (ID 1 ) Non è possibile configurare qualunque flusso perché entrambi gli ISP sono in uso.

Soluzione

Per affrontare questo problema, il quadro può aprire entrambi gli ID telecamera 0 e 1 prima di configurare sessioni di fornire un suggerimento alla telecamera HAL su come allocare le risorse (perché ora si aspetta funzionamento contemporaneo di telecamere). Tuttavia, ciò può portare a funzionalità limitate, ad esempio lo zoom potrebbe non essere in grado di gestire l'intero rapporto di zoom (perché il cambio degli ID fisici della telecamera potrebbe essere problematico).

Per implementare questa soluzione, effettuare le seguenti aggiornamenti provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds .

  • Mandato che per il funzionamento contemporaneo di telecamere, il quadro macchina deve aprire dispositivi della macchina fotografica ( @3.2::ICameraDevice::open ) prima di configurare le sessioni sui dispositivi telecamera. Ciò consente ai fornitori di telecamere di allocare le risorse di conseguenza.

  • Per affrontare il problema di non essere in grado di gestire il rapporto intero campo di zoom, garantire che le applicazioni di telecamere, quando si utilizzano telecamere contemporaneamente, sono garantiti per utilizzare l' ZOOM_RATIO impostazione controllo tra solo 1x e MAX_DIGITAL_ZOOM invece del completo ZOOM_RATIO_RANGE (Questo impedisce la commutazione di fotocamere fisiche interne, che potenzialmente richiede più ISP).

Problema con testDualCameraPreview

Quando si effettua gli aggiornamenti di cui sopra, si può creare un problema con un comportamento consentita dal MultiViewTest.java#testDualCameraPreview test.

Il test testDualCameraPreview non lo fa sessioni di configurazione solo dopo aver aperto tutte le telecamere. Segue questa sequenza:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

Essa, tuttavia, tollera fallimenti aperti fotocamera con ERROR_MAX_CAMERAS_IN_USE [1] . Le app di terze parti potrebbero dipendere da questo comportamento.

Poiché l'HAL della telecamera non conosce il set completo di ID della telecamera che vengono aperti per operazioni simultanee prima di configurare le sessioni, potrebbe essere difficile allocare le risorse hardware (supponendo che ci sia concorrenza per loro).

Per risolvere questo problema, mantenendo la compatibilità oltre a supportare lo streaming simultaneo, HAL telecamera dovrebbero sicuro openCamera chiamate con ERROR_MAX_CAMERAS_IN_USE se non possono supportare configurazione completa flusso per tutte le telecamere esecuzione simultaneamente.