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
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -->
A plataforma Android oferece suporte ao uso de câmeras USB plug and play (ou seja, webcams) com a API Android Camera2 padrão e a interface HAL da câmera. As webcams geralmente são compatíveis com drivers de classe de vídeo USB (UVC). No Linux, o driver padrão Video4Linux (V4L) é usado para controlar câmeras UVC.
Com o suporte para webcams, os dispositivos podem ser usados em casos de uso leves, como chats por 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 do dispositivo USB e enumera os dispositivos de câmera externa de acordo. O processo tem permissões e uma política de SE semelhantes ao processo de HAL da câmera integrada. Os apps de webcam de terceiros que se comunicam diretamente com dispositivos USB exigem as mesmas permissões da câmera para acessar dispositivos UVC que qualquer app de câmera comum.
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 sessão e dispositivo de câmera externa estão incluídas em
ExternalCameraDevice
e
ExternalCameraDeviceSession.
A partir do nível 28 da API, a API cliente Java inclui o nível de hardware
EXTERNAL.
Implementação
A implementação precisa ser compatível com o recurso de sistema
android.hardware.usb.host.
O suporte do kernel para dispositivos UVC também precisa estar ativado. Para ativar essa opção,
adicione o seguinte aos respectivos arquivos defconfig do kernel.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
Para ativar o provedor de câmera externa no build do dispositivo, que adiciona as permissões necessárias do SELinux, 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 e a biblioteca da 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 da 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>Vincule a instância do provedor de câmera AIDL
external/0ahal_camera_serviceno arquivosepolicy/service_contextsdo dispositivo. Para mais informações, consulte SEPolicy para HALs da AIDL.android.hardware.camera.provider.ICameraProvider/external/0 u:object_r:hal_camera_service:s0(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;
Veja 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 com opções gerais de personalização 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
- Tamanho de imagem compatível e limite máximo de frame rate
- Número de buffers em trânsito (compensação entre instabilidade e memória)
Além desses parâmetros, é possível adicionar os seus ou desenvolver suas próprias configurações.
Otimizações específicas do dispositivo
Também é possível melhorar o desempenho adicionando otimizações específicas para dispositivos.
Cópia/dimensionamento de buffer e decodificação/codificação JPEG
As implementações genéricas usam CPU (libyuv/libjpeg), mas é possível substituí-las por otimizações específicas do dispositivo.
Formato de saída 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 o desempenho, é 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âmeras externas 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.