La piattaforma Android supporta l'uso di fotocamere USB plug-and-play (ovvero webcam) utilizzando lo standard API Android Camera2 e la fotocamera HAL a riga di comando. In genere le webcam supportano Classe video USB (UVC) e su Linux, lo standard Video4Linux (V4L) per controllare le videocamere UVC.
Grazie al supporto delle webcam, i dispositivi possono essere utilizzati in casi d'uso leggeri come videochiamate e chioschi fotografici. Questa funzionalità non sostituisce i tipici sistemi interni fotocamera HAL su smartphone Android e non è concepita per supportare attività complesse e ad alte prestazioni che richiedono alta risoluzione streaming ad alta velocità, AR e controllo manuale ISP/sensore/obiettivo.
Il processo HAL per la videocamera USB fa parte del fornitore della videocamera esterna che ascolta la disponibilità dei dispositivi USB ed elenca le videocamere esterne di conseguenza. Il processo dispone delle autorizzazioni e di un criterio SE simile al il processo HAL della fotocamera integrata. App webcam di terze parti che comunicano direttamente con i dispositivi USB richiedono le stesse autorizzazioni della fotocamera per accedere ai dispositivi UVC come con qualsiasi normale app fotocamera.
Esempi e fonti
Per ulteriori informazioni su come implementare le fotocamere USB, fai riferimento alla videocamera esterna
l'implementazione del riferimento del provider
ExternalCameraProvider
Le implementazioni delle sessioni e dei dispositivi per le videocamere esterne sono incluse nella
ExternalCameraDevice
e
ExternalCameraDeviceSession
.
A partire dal livello API 28, l'API client Java include il parametro
EXTERNAL
a livello di hardware.
Implementazione
L'implementazione deve supportare
android.hardware.usb.host
funzionalità di sistema.
È necessario abilitare anche il supporto del kernel per dispositivi UVC. Puoi attivare questa funzionalità
aggiungendo quanto segue ai rispettivi file defconfig
del kernel.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
Per abilitare il fornitore della fotocamera esterna nella rispettiva build del dispositivo, aggiunge le autorizzazioni SELinux necessarie, la configurazione della fotocamera esterna dipende dal fornitore di videocamere esterne, completa i seguenti passaggi:
Aggiungi il file di configurazione della videocamera esterna e la raccolta delle videocamere esterne a
device.mk
.+PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service +PRODUCT_COPY_FILES += \ +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
Aggiungi il nome del fornitore della videocamera esterna al file manifest Treble HAL del dispositivo.
<hal format="aidl"> <name>android.hardware.camera.provider</name> <version>1</version> <interface> <name>ICameraProvider</name> <instance>internal/0</instance> + <instance>external/0</instance> </interface> </hal>
(Facoltativo) Se il dispositivo funziona in modalità passthrough di Treble, aggiorna
sepolicy
in modo checameraserver
possa accedere alla videocamera UVC.+# for external camera +allow cameraserver device:dir r_dir_perms; +allow cameraserver video_device:dir r_dir_perms; +allow cameraserver video_device:chr_file rw_file_perms;
Ecco un esempio di external_camera_config.xml
(righe relative al copyright omesse).
<ExternalCamera> <Provider> <ignore> <!-- Internal video devices to be ignored by external camera HAL --> <id>0</id> <!-- No leading/trailing spaces --> <id>1</id> </ignore> </Provider> <!-- See ExternalCameraUtils.cpp for default values of Device configurations below --> <Device> <!-- Max JPEG buffer size in bytes--> <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) --> <!-- Size of v4l2 buffer queue when streaming >= 30fps --> <!-- Larger value: more request can be cached pipeline (less janky) --> <!-- Smaller value: use less memory --> <NumVideoBuffers count="4"/> <!-- Size of v4l2 buffer queue when streaming < 30fps --> <NumStillBuffers count="2"/> <!-- List of maximum fps for various output sizes --> <!-- Any image size smaller than the size listed in Limit row will report fps (as minimum frame duration) up to the fpsBound value. --> <FpsList> <!-- width/height must be increasing, fpsBound must be decreasing--> <Limit width="640" height="480" fpsBound="30.0"/> <Limit width="1280" height="720" fpsBound="15.0"/> <Limit width="1920" height="1080" fpsBound="10.0"/> <!-- image size larger than the last entry will not be supported--> </FpsList> </Device> </ExternalCamera>
Personalizzazione
Puoi migliorare la fotocamera Android tramite opzioni di personalizzazione generali. o ottimizzazioni specifiche per dispositivo.
Personalizzazioni generali
Puoi personalizzare il fornitore della videocamera esterna modificando
external_camera_config.xml
. In particolare, i clienti possono personalizzare
seguenti parametri:
- Esclusione di nodi video delle videocamere interne
- Dimensioni delle immagini e limite superiore di frequenza fotogrammi supportati
- Numero di buffer inflight (jank e compromesso memoria)
Oltre a questi parametri, puoi aggiungere parametri personalizzati o sviluppare configurazioni personalizzate.
Ottimizzazioni specifiche per dispositivo
Puoi anche migliorare le prestazioni aggiungendo ottimizzazioni specifiche per dispositivo.
Copia/scalabilità nel buffer e decodifica/codifica JPEG
Le implementazioni generiche utilizzano CPU (libyuv/libjpeg), ma puoi sostituirla con ottimizzazioni specifiche per dispositivo.
Formato di output HAL
Le implementazioni generiche utilizzano i seguenti formati di output:
YUV_420_888
per i buffer del videoIMPLEMENTATION_DEFINED
YUV12
per tutti gli altri bufferIMPLEMENTATION_DEFINED
Per migliorare il rendimento, puoi sostituire i formati di output con quelli specifici per dispositivo formati efficienti. Puoi anche supportare formati aggiuntivi in una implementazione
Convalida
I dispositivi con supporto per fotocamere esterne devono superare fotocamera CTS. Il cavo USB esterno la webcam deve rimanere collegata al dispositivo specifico per tutta la durata del test; altrimenti alcuni scenari di test non andranno a buon fine.