Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. Uma cópia da Licença está disponível em
http://www.apache.org/licenses/LICENSE-2.0
A menos que exigido pela legislação aplicável ou acordado por escrito, o software fornecido de acordo com a Licença é distribuído "NO ESTADO EM QUE SE ENCONTRA", SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, expressas ou implícitas. Consulte a Licença para ver o texto específico que rege as permissões e limitações dela. -->
A plataforma Android oferece suporte ao uso de câmeras USB plug and play (ou seja, webcams) usando a API Android Camera2 padrão e a interface HAL da câmera. As webcams geralmente oferecem suporte a drivers de classe de vídeo USB (UVC, na sigla em inglês) e, no Linux, o driver Video4Linux (V4L) padrão é usado para controlar câmeras UVC.
Com o suporte a webcams, os dispositivos podem ser usados em casos de uso leves, como chats de vídeo e quiosques de fotos. Esse recurso não substitui as HALs de câmera interna típicas em smartphones Android e não foi projetado para oferecer suporte a tarefas complexas e de alto desempenho que envolvem streaming de alta resolução e alta velocidade, RA e controle manual de ISP/sensor/lente.
O processo HAL da câmera USB faz parte do provedor de câmera externa que detecta a disponibilidade de dispositivos USB e enumera os dispositivos de câmera externa de acordo com isso. O processo tem permissões e uma política de SE semelhante ao processo HAL da câmera integrada. Os apps de webcam de terceiros que se comunicam diretamente com dispositivos USB exigem as mesmas permissões de câmera para acessar dispositivos UVC que qualquer app de câmera normal.
Exemplos e origens
Para mais informações sobre como implementar câmeras USB, consulte a implementação de referência do provedor de câmera externa em
ExternalCameraProvider.
As implementações de dispositivo e sessão de câmera externa estão incluídas em
ExternalCameraDevice
e
ExternalCameraDeviceSession.
A partir do nível 28 da API, a API do cliente Java inclui o
EXTERNAL
nível de hardware.
Implementação
A implementação precisa oferecer suporte ao
android.hardware.usb.host
recurso do sistema.
O suporte do kernel para dispositivos UVC também precisa ser ativado. Para fazer isso, adicione o seguinte aos arquivos defconfig do kernel.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
Para ativar o provedor de câmera externa na build do dispositivo, que adiciona as permissões SELinux necessárias, a configuração da câmera externa e a dependência do provedor de câmera externa, siga estas etapas:
Adicione o arquivo de configuração da câmera externa e a biblioteca de câmera externa 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.xmlAdicione o nome do provedor de câmera externa ao manifesto HAL do Treble do 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>(Opcional) Se o dispositivo for executado no modo de passagem do Treble, atualize
sepolicypara quecameraserverpossa acessar a câmera 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;
Confira um exemplo de external_camera_config.xml (linhas de direitos autorais omitidas).
<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>
Personalização
É possível melhorar a câmera do Android usando opções de personalização gerais ou otimizações específicas do dispositivo.
Personalizações gerais
É possível personalizar o provedor de câmera externa modificando o arquivo external_camera_config.xml. Especificamente, os clientes podem personalizar os seguintes parâmetros:
- Exclusão de nós de vídeo de câmeras internas
- Limite superior de tamanho da imagem e taxa de frames com suporte
- Número de buffers em trânsito (troca de memória x instabilidade)
Além desses parâmetros, você pode adicionar seus próprios parâmetros ou desenvolver suas próprias configurações.
Otimizações específicas do dispositivo
Também é possível melhorar a performance adicionando otimizações específicas do dispositivo.
Cópia/escalonamento de buffer e decodificação/codificação JPEG
As implementações genéricas usam a CPU (libyuv/libjpeg), mas é possível substituir isso por otimizações específicas do dispositivo.
Formato de saída HAL
As implementações genéricas usam os seguintes formatos de saída:
YUV_420_888para buffers de vídeoIMPLEMENTATION_DEFINEDYUV12para todos os outros buffersIMPLEMENTATION_DEFINED
Para melhorar a performance, é possível substituir os formatos de saída por formatos eficientes específicos do dispositivo. Também é possível oferecer suporte a outros formatos em uma implementação personalizada.
Validação
Os dispositivos com suporte a câmera externa precisam passar no CTS da câmera. A webcam USB externa precisa permanecer conectada ao dispositivo específico durante toda a execução do teste. Caso contrário, alguns casos de teste vão falhar.