La piattaforma Android supporta l'uso di fotocamere USB plug-and-play (ovvero webcam) utilizzando l' API Android Camera2 standard e l'interfaccia HAL della fotocamera. Le webcam generalmente supportano i driver USB video class (UVC) e su Linux, il driver standard Video4Linux (V4L) viene utilizzato per controllare le fotocamere UVC.
Con il supporto per le webcam, i dispositivi possono essere utilizzati in casi d'uso leggeri come chat video e chioschi fotografici. Questa funzionalità non sostituisce i tipici HAL interni della fotocamera sui telefoni Android e non è progettata per supportare attività complesse e ad alto utilizzo di prestazioni che coinvolgono streaming ad alta risoluzione e ad alta velocità, AR e controllo manuale ISP/sensore/obiettivo.
Il processo HAL della fotocamera USB fa parte del provider della fotocamera esterna che ascolta la disponibilità del dispositivo USB ed enumera di conseguenza i dispositivi della fotocamera esterna. Il processo dispone di autorizzazioni e una policy SE simili al processo HAL della fotocamera integrata. Le app per webcam di terze parti che comunicano direttamente con i dispositivi USB richiedono le stesse autorizzazioni della fotocamera per accedere ai dispositivi UVC di qualsiasi normale app per fotocamera.
Esempi e fonti
Per ulteriori informazioni su come implementare le fotocamere USB, vedere l'implementazione di riferimento del provider di fotocamere esterne in ExternalCameraProvider
. Il dispositivo fotocamera esterno e le implementazioni della sessione sono inclusi in ExternalCameraDevice
e ExternalCameraDeviceSession
. A partire dal livello API 28, l'API del client Java include il livello hardware EXTERNAL
.
Implementazione
L'implementazione deve supportare la funzionalità di sistema android.hardware.usb.host
.
Anche il supporto del kernel per i dispositivi UVC deve essere abilitato. Puoi abilitarlo 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, che aggiunge le autorizzazioni SELinux necessarie, la configurazione della fotocamera esterna e la dipendenza dal fornitore della fotocamera esterna, completare i seguenti passaggi:
Aggiungi il file di configurazione della fotocamera esterna e la libreria della fotocamera esterna 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 provider della fotocamera esterna al manifest HAL Treble 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 viene eseguito in modalità passthrough Treble, aggiornare
sepolicy
in modo checameraserver
possa accedere alla fotocamera 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 di 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 del dispositivo.
Personalizzazioni generali
È possibile personalizzare il provider della fotocamera esterna modificando il file external_camera_config.xml
. Nello specifico, i clienti possono personalizzare i seguenti parametri:
- Esclusi i nodi video delle telecamere interne
- Dimensioni dell'immagine supportate e limite superiore della frequenza fotogrammi
- Numero di buffer in volo (compromesso tra jank e memoria)
Oltre a questi parametri, puoi aggiungere i tuoi parametri o sviluppare le tue configurazioni.
Ottimizzazioni specifiche del dispositivo
Puoi anche migliorare le prestazioni aggiungendo ottimizzazioni specifiche del dispositivo.
Copia/ridimensionamento del buffer e decodifica/codifica JPEG
Le implementazioni generiche utilizzano la CPU (libyuv/libjpeg) ma puoi sostituirla con ottimizzazioni specifiche del dispositivo.
Formato di output HAL
Le implementazioni generiche utilizzano i seguenti formati di output:
-
YUV_420_888
per i buffer videoIMPLEMENTATION_DEFINED
-
YUV12
per tutti gli altri bufferIMPLEMENTATION_DEFINED
Per migliorare le prestazioni, puoi sostituire i formati di output con formati efficienti specifici del dispositivo. Puoi anche supportare formati aggiuntivi in un'implementazione personalizzata
Validazione
I dispositivi con supporto per fotocamera esterna devono superare il CTS della fotocamera . La webcam USB esterna deve rimanere collegata al dispositivo specifico durante l'intero test, altrimenti alcuni casi di test falliranno.