Streaming della videocamera simultaneo

Android consente ai dispositivi di supportare lo streaming simultaneo di videocamere. Ad esempio, ciò consente a un dispositivo di far funzionare contemporaneamente le fotocamere anteriore e posteriore. A partire da Android 11, l'API Camera2 include i seguenti metodi che le app possono chiamare per determinare se le videocamere supportano lo streaming simultaneo e le configurazioni di streaming supportate.

  • getConcurrentCameraIds: Recupera l'insieme di combinazioni di identificatori di dispositivi videocamera attualmente connessi che supportano la configurazione simultanea delle sessioni dei dispositivi videocamera.
  • isConcurrentSessionConfigurationSupported: Controlla se il set fornito di dispositivi di ripresa e le relative configurazioni di sessione possono essere configurati contemporaneamente.

Un insieme di combinazioni di stream obbligatorie che devono essere supportate durante lo streaming simultaneo sono incluse tramite le caratteristiche della videocamera di un dispositivo videocamera nella proprietà SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS.

Ogni dispositivo videocamera pubblicizzato tramite getConcurrentStreamingCameraIds() deve supportare le seguenti configurazioni garantite per gli stream simultanei.

Target 1 Target 2
Tipo Dimensione massima Tipo Dimensione massima Esempi di casi d'uso
YUV s1440p Elaborazione di video o immagini in-app
PRIV s1440p Analisi del mirino in-app
JPEG s1440p Nessuna acquisizione di immagini fisse nel mirino
YUV / PRIV s720p JPEG s1440p Immagini statiche standard
YUV / PRIV s720p YUV / PRIV s1440p Video in-app o elaborazione con anteprima

I dispositivi con funzionalità MONOCHROME (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES include CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) che supportano Y8 devono supportare la sostituzione dei flussi YUV con Y8 in tutte le combinazioni di flussi garantite.

s720p si riferisce a 720p (1280 x 720) o alla risoluzione massima supportata per il formato specifico restituito da StreamConfigurationMap.getOutputSizes(). s1440p si riferisce a 1440p (1920 x 1440) o alla risoluzione massima supportata per il particolare formato restituito da 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 risoluzioni seguenti:

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

Implementazione

Per consentire alle app di eseguire query su un dispositivo per determinare se le sue fotocamere supportano lo streaming simultaneo, implementa l'interfaccia HAL ICameraProvider@2.6, che include i seguenti metodi:

Per un'implementazione di riferimento dell'interfaccia HAL ICameraProvider@2.6, consulta la libreria HAL della videocamera emulata all'indirizzo EmulatedCameraProviderHWLImpl.cpp.

Convalida

Per verificare che l'implementazione di questa funzionalità funzioni come previsto, utilizza il test CTS ConcurrentCameraTest.java. Inoltre, esegui il test utilizzando un'app che apre più videocamere e le gestisce contemporaneamente.

Problemi di allocazione delle risorse

Se gli HAL della fotocamera annunciano il supporto del funzionamento simultaneo dei dispositivi della fotocamera, potrebbero riscontrare problemi di allocazione delle risorse, soprattutto nel caso in cui sullo smartphone siano presenti risorse ISP (Image Signal Processor) sufficienti per trasmettere in streaming contemporaneamente le fotocamere anteriore e posteriore (o altre), ma non alla loro piena capacità. In questo caso, l'HAL della fotocamera deve allocare risorse hardware limitate a ogni dispositivo fotocamera.

Scenario di esempio

Il seguente scenario mostra questo problema.

Problema

Il dispositivo ha la seguente configurazione:

  • L'ID fotocamera 0 è una fotocamera logica supportata da una fotocamera grandangolare e una ultrawide, ognuna delle quali utilizza una risorsa ISP.
  • L'ID fotocamera 1 è una fotocamera che utilizza una risorsa ISP.

Il dispositivo (smartphone) ha due ISP. Se viene aperto l'ID videocamera 0 e viene configurata una sessione, è possibile che l'HAL della videocamera riservi due ISP prevedendo l'utilizzo sia della videocamera ultrawide che di quella grandangolare.

In questo caso, la videocamera anteriore (ID 1) non può configurare nessuno stream perché entrambi i provider di servizi internet sono in uso.

Soluzione

Per risolvere questo problema, il framework può aprire entrambi gli ID fotocamera 0 e 1 prima di configurare le sessioni per fornire un suggerimento all'HAL della fotocamera su come allocare le risorse (perché ora prevede il funzionamento simultaneo delle fotocamere). Tuttavia, ciò può comportare funzionalità limitate, ad esempio lo zoom potrebbe non essere in grado di gestire l'intero rapporto di zoom (perché il cambio degli ID fotocamera fisici potrebbe essere problematico).

Per implementare questa soluzione, apporta i seguenti aggiornamenti a provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds.

  • Stabilisci che per il funzionamento simultaneo delle videocamere, il framework della videocamera deve aprire i dispositivi videocamera (@3.2::ICameraDevice::open) prima di configurare qualsiasi sessione sui dispositivi videocamera. In questo modo, i fornitori di videocamere possono allocare le risorse di conseguenza.

  • Per risolvere il problema dell'impossibilità di gestire l'intero rapporto di zoom, assicurati che le app della videocamera, quando utilizzano le videocamere contemporaneamente, garantiscano l'utilizzo dell'impostazione di controllo ZOOM_RATIO solo tra 1x e MAX_DIGITAL_ZOOM anziché l'intero ZOOM_RATIO_RANGE (in questo modo si impedisce il passaggio interno tra le videocamere fisiche, il che potenzialmente richiede più ISP).

Problema con testDualCameraPreview

Quando apporti gli aggiornamenti sopra indicati, può verificarsi un problema con un comportamento consentito dal test MultiViewTest.java#testDualCameraPreview.

Il test testDualCameraPreview non configura le sessioni solo dopo l'apertura di tutte le videocamere. Segue questa sequenza:

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

Tuttavia, tollera gli errori di apertura della videocamera con ERROR_MAX_CAMERAS_IN_USE [1]. Le app di terze parti potrebbero dipendere da questo comportamento.

Poiché l'HAL della videocamera non conoscerà l'insieme completo di ID videocamera aperti per il funzionamento simultaneo prima di configurare le sessioni, potrebbe essere difficile allocare le risorse hardware (supponendo che ci sia una certa concorrenza per queste).

Per risolvere questo problema, mantenendo la compatibilità con le versioni precedenti e supportando lo streaming simultaneo, le HAL della videocamera devono restituire errori alle chiamate openCamera con ERROR_MAX_CAMERAS_IN_USE se non riescono a supportare la configurazione completa dello stream per tutte le videocamere in esecuzione contemporaneamente.