Per i dispositivi con Android 14-QPR1 o versioni successive, Android supporta l'utilizzo della
come webcam USB. I dispositivi Android che supportano questa funzionalità
come dispositivo UVC, che consente a un'ampia gamma di host USB con diverse
(ad es. Linux, macOS, Windows e ChromeOS) utilizzano
la videocamera del dispositivo come una webcam. Il servizio DeviceAsWebcam
supporta questa funzionalità per utilizzare il dispositivo come una webcam.
Servizio DeviceAsWebcam
Il servizio DeviceAsWebcam
in AOSP include un'attività di anteprima
(DeviceAsWebcamPreview.java
) che consente agli utenti di inquadrare la scena. Anteprima
consente all'utente di:
Visualizza l'anteprima del feed della webcam sulla macchina host prima di trasmettere in streaming .
Personalizza il feed della webcam inviato all'host nei seguenti modi:
- Selezione della videocamera per lo streaming, anteriore o posteriore.
- Selezione del livello di zoom utilizzando un dispositivo di scorrimento o i pulsanti.
- Toccare una particolare area dell'anteprima per impostare lo stato attivo o rimuoverlo. in una regione.
L'attività di anteprima funziona con le funzioni di accessibilità generali su Android, come come TalkBack, Switch Access e Voice Access.
Figura 1. Il feed della webcam viene trasmesso in streaming a un host con un'anteprima che controlla feed.
Architettura
L'architettura da supportare per l'utilizzo di un dispositivo come webcam è illustrata in
Figura 2. Di seguito viene descritto il flusso di interazione dell'DeviceAsWebcam
con il resto del framework Android:
- L'utente seleziona l'opzione webcam USB nell'app Impostazioni.
- L'app Impostazioni invia una chiamata a binder a
system_server
tramiteUsbManager
corso che lo informa cheFUNCTION_UVC
è stato selezionato. - Il server di sistema effettua le seguenti operazioni:
- Informa l'HAL del gadget USB per recuperare la funzione del gadget UVC attraverso un
Chiamata all'interfaccia dell'HAL
setUsbFunctions
. - Informa l'HAL per il gadget USB di configurare il driver del gadget UVC utilizzando ConfigF.
- Informa l'HAL del gadget USB per recuperare la funzione del gadget UVC attraverso un
Chiamata all'interfaccia dell'HAL
- Quando viene richiamato il gadget HAL,
system_server
invia un al framework per essere selezionato dal servizioDeviceAsWebcam
. - Il driver del gadget USB avvia lo stream della webcam alla ricezione della configurazione
dall'host attraverso i nodi V4L2 all'indirizzo
/dev/video*
.
Figura 2. Architettura di DeviceAsWebcam.
Implementazione
Questa sezione descrive come supportare l'utilizzo di un dispositivo Android come webcam.
Supporto kernel
Per Android 14 o versioni successive, la GKI (Generic Kernel Image) abilita il widget UVC driver per impostazione predefinita (vedi i dettagli nella patch AOSP).
Supporta UVC in Gadget HAL
A partire da Android 14, la funzione UVC è inclusa nella
GadgetFunction.aidl
dell'HAL. Per Gadget HAL, gli UVC
il gadget viene montato in ConfigFS nello stesso modo di altre funzioni ConfigFS come
come MTP o ADB.
Per implementare il gadget HAL, apporta modifiche per montare la funzione UVC su o ConfigFS. Di seguito è riportato un esempio di snippet di un'implementazione dell'HAL per i gadget che supportano la funzione UVC:
UsbGadget::setCurrentUsbFunctions(long functions) {
...
// Existing functions
if ((functions & GadgetFunction::MTP) != 0) {
...
linkFunction("ffs.mtp"); // Mount to ConfigFS
...
}
...
// UVC function follows the same pattern!
if ((functions & GadgetFunction::UVC) != 0) {
...
linkFunction("uvc.0"); // Mount to ConfigFS
...
}
...
}
Quando il dispositivo funge da webcam, assicurati che il gadget USB HAL pubblicizzi le combinazioni VID/PID corrette.
Perché tutta la logica UVC si trova in init del fornitore o nel campo DeviceAsWebcam
nessuna logica specifica per l'UVC, a parte la simbolizzazione della funzione UVC a
Il comando ConfigFS è obbligatorio nell'HAL del gadget.
Per ulteriori indicazioni sull'implementazione, vedi il seguente codice campione in AOSP:
Imposta ConfigFS con configurazioni UVC
Per comunicare al driver del gadget UVC i formati, le dimensioni e le frequenze fotogrammi supportata dalla webcam Android, configura ConfigFS con configurazioni UVC. Per per ulteriori informazioni, consulta la documentazione upstream di Linux sul documento ConfigFS UVC ABI del gadget.
Di seguito è riportato un esempio di come l'init del fornitore può configurare il driver del gadget UVC (snippet di codice in AOSP):
# uvc function
mkdir /configfs_path/functions/uvc.0
write /configfs_path/functions/uvc.0/function_name "Android Webcam"
write /configfs_path/functions/uvc.0/streaming_maxpacket 3072
# setup control params
mkdir /configfs_path/functions/uvc.0/control/header/h
symlink /configfs_path/functions/uvc.0/control/header/h \
/configfs_path/functions/uvc.0/control/class/fs/h
symlink /configfs_path/functions/uvc.0/control/header/h \
/configfs_path/functions/uvc.0/control/class/ss/h
# advertise 1080p resolution for webcam encoded as mjpeg
mkdir /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wHeight 1080
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wWidth 1920
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwMaxVideoFrameBufferSize 4147200
# advertise 30 fps support for 1080p.
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwDefaultFrameInterval 333333
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwFrameInterval "333333"
# setup streaming params
mkdir /configfs_path/functions/uvc.0/streaming/header/h
symlink /configfs_path/functions/uvc.0/streaming/mjpeg/m \
/configfs_path/functions/uvc.0/streaming/header/h/m
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/configfs_path/functions/uvc.0/streaming/class/fs/h
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/configfs_path/functions/uvc.0/streaming/class/hs/h
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/config/usb_gadget/g1/functions/uvc.0/streaming/class/ss/h
# ...
Questo snippet imposta il driver del gadget UVC per pubblicizzare uno stream MJPEG da 1080p all'indirizzo 30 f/s. Queste funzionalità vengono comunicate all'host USB quando esegue query risoluzioni e frequenze fotogrammi supportate.
Di seguito sono riportate le linee guida generali per la selezione delle configurazioni della webcam fa pubblicità:
- I due formati di stream supportati dal servizio
DeviceAsWebcam
sono MJPEG e YUYV non compresso. - USB 2.0 supporta il trasferimento di dati a 480 Mbps (60 MBps). Questo
significa che a 30 f/s, ogni frame deve avere una dimensione massima di 2 MB;
e a 60 f/s, per una dimensione massima di 1 MB.
- Stream non compressi (YUYV): a 30 f/s, il numero massimo di fotogrammi supportati è di 720p perché YUYV è di 2 byte per pixel.
- Stream MJPEG compressi: supponendo un rapporto di compressione 1:10 da YUV, USB 2.0 può supportare la risoluzione 4K (1,18 MB per frame).
- Le fotocamere principali e posteriori devono supportare tutte le dimensioni di inquadratura vengono annunciati. Questo perché l'utente può passare da un ID videocamera all'altro utilizzando l'interfaccia utente di anteprima. Per gli stream MJPEG, consigliamo ai fornitori di pubblicizzare il formato 480p (640 x 480), 720p (1280 x 820) e 1080p (1920 x 1080) perché si tratta comunemente utilizzate dalle app host.
- I dispositivi principali delle fotocamere anteriore e posteriore devono supportare tutte le frequenze fotogrammi pubblicizzato. Consigliamo vivamente ai fornitori di supportare la velocità a 30 f/s.
Per un esempio di aggiunta di configurazioni di stream con webcam (ConfigFS), consulta Patch di esempio AOSP.
Attiva la webcam nella build
Per attivare il servizio DeviceAsWebcam
, devi impostare ro.usb.uvc.enabled
di sistema su true
nel file device.mk
.
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
Quando questa proprietà di sistema è attiva, nella Impostazioni nelle preferenze USB, come mostrato nella Figura 3. Quando l'opzione è selezionata, il dispositivo Android viene visualizzato come webcam USB per il dispositivo host.
Figura 3. Preferenze USB nell'app Impostazioni.
Puoi anche impostare il dispositivo alla funzione webcam USB tramite ADB utilizzando questo :
adb shell svc usb setFunctions uvc
Considerare i problemi di alimentazione e termica
Operazioni con la webcam significa che la fotocamera di un dispositivo potrebbe essere attiva per più ore al giorno, pertanto consigliamo di adottare misure per garantire che l'alimentazione consumo e termico del dispositivo rimangono al di sotto di determinati limiti. La di seguito sono riportate le soluzioni consigliate per mantenere il consumo energetico entro i limiti:
- Per migliorare le prestazioni energetiche dell'HAL della fotocamera, abilita
STREAM_USE_CASE_VIDEO_CALL
nel servizioDeviceAsWebcam
. Se l'alimentazione è un problema anche con
STREAM_USE_CASE_VIDEO_CALL
attivo, la Il servizioDeviceAsWebcam
offre un'opzione per ridurre ulteriormente l'alimentazione il consumo eccessivo tramite flussi fisici. Puoi utilizzare la modalità overlay di risorse di runtime per specificare la videocamera fisica da utilizzare per gli utilizzi odierni. Gli stream fisici riducono notevolmente la qualità video e causano un'esperienza utente poco chiara, quindi usa questa soluzione solo come ultima risorsa. OttimizzazioneSTREAM_USE_CASE_VIDEO_CALL
è la soluzione preferita per l'alimentazione i problemi correlati. Per ulteriori informazioni sugli RRO supportati dalDeviceAsWebcam
consulta readme.md.Di seguito è riportato un esempio di configurazione RRO per l'utilizzo dell'ID fotocamera fisico 3 anziché l'ID fotocamera logica 0. Per un esempio in AOSP, vedi DeviceAsWebcamRaven.
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
Verifica
Per testare l'implementazione del servizio DeviceAsWebcam
sul tuo dispositivo, utilizza
i seguenti test:
- Test della webcam dello strumento di verifica CTS: verifica formati, dimensioni e le frequenze fotogrammi sono supportate dal dispositivo.
- Test manuali: verifica che la funzionalità della webcam funzioni con una serie di app host su una varietà di sistemi operativi host.
Problemi noti
Di seguito sono riportati i problemi noti del servizio DeviceAsWebcam
:
Lo stream del driver del gadget UVC a volte sfarfalla e mostra i frame danneggiati. Questo problema è stato risolto e unito a monte e in GKI.
I dispositivi Android in modalità webcam non funzionano con cavi USB 3.0 o versioni successive attivi macOS a causa di un bug del driver UVC di Apple.