Rilasciato ai sensi della Licenza Apache, versione 2.0 (la "Licenza"); è possibile utilizzare questo file esclusivamente in conformità con la Licenza. Una copia della Licenza è disponibile all'indirizzo
http://www.apache.org/licenses/LICENSE-2.0
Se non diversamente imposto dalla legge vigente o concordato per iscritto, il software rilasciato ai sensi della Licenza viene distribuito "COSÌ COM'È", SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, esplicite o implicite. See the License for the specific language governing permissions and limitations under the License. -->
La piattaforma Android supporta l'uso di videocamere USB plug-and-play (ovvero webcam) utilizzando l'API Camera2 di Android standard e l'interfaccia HAL della videocamera. Le webcam in genere supportano i driver USB Video Class (UVC) e su Linux viene utilizzato il driver Video4Linux (V4L) standard 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 HAL della fotocamera interna sugli smartphone Android e non è progettata per supportare attività complesse e ad alte prestazioni che coinvolgono streaming ad alta risoluzione e ad alta velocità, AR e controllo manuale di ISP/sensore/obiettivo.
Il processo HAL della videocamera USB fa parte del fornitore di videocamere esterne che ascolta la disponibilità dei dispositivi USB ed enumera i dispositivi di videocamere esterne di conseguenza. La procedura ha autorizzazioni e una policy SE simili alla procedura 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 come qualsiasi app per fotocamera normale.
Esempi e fonti
Per ulteriori informazioni su come implementare le videocamere USB, consulta l'implementazione di riferimento del fornitore di videocamere esterne all'indirizzo
ExternalCameraProvider
.
Le implementazioni di sessione e dispositivo della videocamera esterna sono incluse in
ExternalCameraDevice
e
ExternalCameraDeviceSession
.
A partire dal livello API 28, l'API client Java include il
EXTERNAL
livello hardware.
Implementazione
L'implementazione deve supportare la funzionalità di sistema
android.hardware.usb.host
.
Deve essere abilitato anche il supporto del kernel per i dispositivi UVC. Puoi abilitare questa funzionalità
aggiungendo quanto segue ai rispettivi file del kernel defconfig
.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
Per attivare il fornitore di fotocamere esterne nella build del dispositivo corrispondente, che aggiunge le autorizzazioni SELinux necessarie, la configurazione della fotocamera esterna e la dipendenza del fornitore di fotocamere esterne, completa i seguenti passaggi:
Aggiungi il file di configurazione della videocamera esterna e la libreria della videocamera 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 fornitore della videocamera 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 funziona in modalità passthrough 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 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
Puoi personalizzare il fornitore di videocamere esterne modificando il file
external_camera_config.xml
. In particolare, i clienti possono personalizzare i seguenti parametri:
- Esclusi i nodi video delle videocamere interne
- Limite superiore per le dimensioni dell'immagine e la frequenza dei fotogrammi supportate
- 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 per dispositivo
Puoi anche migliorare il rendimento aggiungendo ottimizzazioni specifiche per dispositivo.
Copia/scalabilità del buffer e decodifica/codifica JPEG
Le implementazioni generiche utilizzano la CPU (libyuv/libjpeg), ma puoi sostituirle con ottimizzazioni specifiche per il dispositivo.
Formato di output HAL
Le implementazioni generiche utilizzano i seguenti formati di output:
YUV_420_888
per il buffer dei videoIMPLEMENTATION_DEFINED
YUV12
per tutti gli altri bufferIMPLEMENTATION_DEFINED
Per migliorare le prestazioni, puoi sostituire i formati di output con formati efficienti specifici per il dispositivo. Puoi anche supportare formati aggiuntivi in un'implementazione personalizzata.
Convalida
I dispositivi con supporto di fotocamere esterne devono superare il test CTS della fotocamera. La webcam USB esterna deve rimanere collegata al dispositivo specifico per l'intera esecuzione del test, altrimenti alcuni scenari di test non andranno a buon fine.