Para dispositivos com o Android 14 QPR1 ou mais recente, o Android oferece suporte ao uso do
do dispositivo como webcam USB. Há anúncios de dispositivos Android compatíveis com esse recurso
como um dispositivo UVC, que permite uma ampla variedade de hosts USB com diferentes
(por exemplo, Linux, macOS, Windows e ChromeOS) usam a
a câmera de seu dispositivo como webcam. O serviço DeviceAsWebcam
é compatível com este recurso para usar o dispositivo como webcam.
Serviço DeviceAsWebcam
O serviço DeviceAsWebcam
no AOSP inclui uma atividade de visualização.
(DeviceAsWebcamPreview.java
) que permite aos usuários enquadrar a cena. Prévia
permite que o usuário faça o seguinte:
Prévia do feed da webcam na máquina host antes da transmissão começa.
Personalize o feed da webcam enviado ao host das seguintes maneiras:
- Selecione a câmera para transmitir, frontal ou traseira.
- Selecionar o nível de zoom usando um controle deslizante ou botões.
- Tocar em uma região específica da visualização para focar ou remover o foco em uma região.
A atividade de visualização funciona com recursos gerais de acessibilidade no Android, como como TalkBack, acesso com interruptor e Acesso por voz.
Figura 1. Feed de webcam sendo transmitido para um organizador com visualização controlando o se alimentam.
Arquitetura
A arquitetura para suporte ao uso de um dispositivo como webcam está ilustrada em
Figura 2. Confira a seguir a descrição do fluxo de interação do DeviceAsWebcam
.
com o restante do framework do Android:
- O usuário seleciona a opção de webcam USB no app Configurações.
- O app Configurações envia uma chamada de vinculação para
system_server
peloUsbManager
informando queFUNCTION_UVC
foi selecionado. - O servidor do sistema faz o seguinte:
- Informa a HAL do gadget USB para recuperar a função do gadget UVC por meio de um
Chamada de interface HAL
setUsbFunctions
. - Informa a HAL do gadget USB para configurar o driver do gadget UVC usando os ConfigFs.
- Informa a HAL do gadget USB para recuperar a função do gadget UVC por meio de um
Chamada de interface HAL
- Ao receber uma chamada de retorno da HAL do gadget, o
system_server
envia uma transmitida ao framework para ser selecionada pelo serviçoDeviceAsWebcam
. - O driver do gadget USB inicia o fluxo da webcam ao receber a configuração
do host por meio de nós da V4L2 em
/dev/video*
.
Figura 2. Arquitetura do DeviceAsWebcam.
Implementação
Esta seção descreve como oferecer suporte ao uso de um dispositivo Android como webcam.
Suporte do kernel
No Android 14 ou versões mais recentes, a imagem genérica do kernel (GKI, na sigla em inglês) ativa o gadget UVC driver por padrão. Confira detalhes em patch do AOSP.
Suporte a UVC na HAL de gadget
No Android 14 e versões mais recentes, a função UVC está incluída no
Interface HAL GadgetFunction.aidl
. Para a HAL de gadget, a UVC
é montado no ConfigFS da mesma forma que outras funções do ConfigFS, como
como MTP ou ADB.
Para implementar a HAL de gadget, faça modificações para montar a função UVC para o ConfigFS. Este é um snippet de exemplo de implementação de HAL de gadget suporte à função 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 o dispositivo estiver agindo como uma webcam, verifique se o gadget USB HAL está anunciando as combinações VID/PID adequadas.
Como toda a lógica UVC está no init do fornecedor ou no DeviceAsWebcam
serviço, sem lógica específica de UVC, além da vinculação simbólica da função UVC para
ConfigFS, é obrigatório na HAL de gadget.
Para mais orientações sobre a implementação, consulte o exemplo de código abaixo no AOSP:
Definir o ConfigFS com configurações de UVC
Para informar ao driver do gadget UVC quais formatos, tamanhos e frame rates são compatível com a webcam do Android, defina o ConfigFS com configurações UVC. Para mais informações, consulte a documentação upstream do Linux na documentação do ConfigFS UVC ABI do gadget.
O exemplo a seguir mostra como o init do fornecedor pode configurar o driver do gadget UVC (Snippet de código no 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
# ...
Este snippet configura o driver do gadget UVC para anunciar um stream MJPEG de 1080p em 30 fps. Esses recursos são comunicados ao host USB quando ele faz uma consulta as resoluções e os frame rates com suporte.
A seguir estão as diretrizes gerais para selecionar as configurações da webcam anuncia:
- Os dois formatos de stream com suporte do serviço
DeviceAsWebcam
são MJPEG e YUYV descompactado. - O USB 2.0 oferece suporte à transferência de dados de 480 Mbps (60 MBps). Isso
significa que, a 30 fps, cada frame precisa ter o tamanho máximo de 2 MB.
e a 60 fps, com tamanho máximo de 1 MB.
- Streams não compactados (YUYV): a 30 fps, o frame máximo suportado o tamanho é 720p porque YUYV é de 2 bytes por pixel.
- Streams MJPEG compactados: considerando uma taxa de compactação de 1:10 do YUV, O USB 2.0 oferece suporte a 4K (1,18 MB por frame).
- Os principais dispositivos de câmera frontal e traseira precisam oferecer suporte a todos os tamanhos de frame que são anunciados. Isso ocorre porque o usuário pode alternar entre IDs de câmera usando a interface de visualização. Para streams MJPEG, recomendamos que os fornecedores anunciem 480p (640 x 480), 720p (1280 x 820) e 1080p (1920 x 1080), pois esses tamanhos tamanhos de código normalmente usados por apps host.
- Os principais dispositivos de câmera frontal e traseira precisam oferecer suporte a todos os frame rates anunciados. Recomendamos que os fornecedores ofereçam suporte a 30 QPS.
Para conferir um exemplo de como adicionar configurações de transmissão de webcam (ConfigFS), consulte Patch de exemplo do AOSP.
Ativar webcam no build
Para ativar o serviço DeviceAsWebcam
, defina o ro.usb.uvc.enabled
propriedade do sistema como true
no arquivo device.mk
.
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
Quando essa propriedade do sistema está ativada, a opção Webcam aparece na App Configurações em "Preferências de USB", como mostrado na Figura 3. Quando a opção é selecionado, o dispositivo Android aparecerá como uma webcam USB no dispositivo host.
Figura 3. Preferências de USB no app Configurações.
Você também pode configurar o dispositivo para a função webcam USB pelo ADB usando este comando:
adb shell svc usb setFunctions uvc
Considere as preocupações com energia e temperatura
Operações de webcam significam que a câmera de um dispositivo pode ficar ligada por várias horas por dia. Por isso, recomendamos tomar medidas para garantir que a energia o consumo e a temperatura do dispositivo permanecem abaixo de certos limites. A estas são as soluções recomendadas para manter o consumo de energia abaixo dos limites:
- Para melhorar o desempenho da alimentação da HAL da câmera, ative
STREAM_USE_CASE_VIDEO_CALL
no serviçoDeviceAsWebcam
. Se a energia for uma preocupação mesmo com a
STREAM_USE_CASE_VIDEO_CALL
ativada, a O serviçoDeviceAsWebcam
oferece uma opção para diminuir ainda mais a energia o consumo de recursos usando streams físicos. Você pode usar sobreposições de recursos no ambiente de execução (RROs, na sigla em inglês) para especificar qual câmera física usar. As transmissões físicas reduzem significativamente a qualidade do vídeo e levam a um confusa, então use essa solução apenas como último recurso. OtimizaçãoSTREAM_USE_CASE_VIDEO_CALL
é a solução ideal para problemas. Para mais informações sobre as RROs com suporte doDeviceAsWebcam
, consulte readme.md.Confira a seguir um exemplo de RRO configurada para usar a câmera física ID 3 em vez do ID de câmera lógica 0. Para conferir um exemplo no AOSP, consulte DeviceAsWebcamRaven.
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
Verificação
Para testar a implementação do serviço DeviceAsWebcam
no seu dispositivo, use
os seguintes testes:
- Teste do verificador CTS webcam: teste os formatos, tamanhos e são compatíveis com o dispositivo.
- Testes manuais: teste se o recurso de webcam funciona com vários aplicativos host em vários sistemas operacionais host.
Problemas conhecidos
Confira a seguir problemas conhecidos do serviço DeviceAsWebcam
:
O fluxo do driver do gadget UVC às vezes pisca e mostra o que parecem frames corrompidos. Esse problema foi corrigido e mesclado upstream e em GKI.
Dispositivos Android no modo webcam não funcionam com cabos USB 3.0 ou superiores ativados Hosts macOS devido a um bug no driver UVC da Apple.