Crie um dispositivo virtual UVC para transmitir vídeo como webcam

2

Estou procurando uma maneira de usar um arquivo de vídeo e transmiti-lo para que pareça um dispositivo UVC real.

Eu fiz algumas pesquisas e encontrei uvc-gadget Mas não consigo descobrir se isso é o que eu sou depois de. Eu tenho que usar UVC porque eventualmente eu quero poder transmitir o vídeo através de um outro dispositivo sem ter nenhum software extra instalado no receptor. Mas, por enquanto, apenas uma ferramenta que pode ser executada no mesmo dispositivo e emular um dispositivo UVC funcionará.

Existe alguma ferramenta disponível que possa fazer isso?

    
por Sam 01.09.2018 / 16:33

1 resposta

1

USB é assimétrico: existem mestres USB (seu PC) e escravos USB (os dispositivos). É por isso que existem dois tipos diferentes de conectores USB, tipo A para mestres e tipo B para escravos, embora a distinção esteja ficando borrada por designers de hardware usando o tipo A em todos os lugares, e o USB OTG pode fazer as duas coisas.

Dispositivos de dispositivo USB Linux são módulos do kernel que representam um dispositivo USB em um controlador escravo USB. Eles precisam de um controlador host (escravo) para se conectar; em um sistema Linux embarcado representando o dispositivo, esse seria o driver para o controlador USB. Em um PC não há hardware.

Mas há outro módulo do kernel que pode simular um controlador USB: dummy_hcd . Este módulo fornecerá um controlador de host virtual (escravo) para os dispositivos se conectarem e um controlador de host virtual (mestre) que fornece um barramento USB adicional onde esses dispositivos são exibidos.

Exemplo:

# modprobe dummy_hcd
# lsusb
...
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
# modprobe g_serial
# lsusb
...
Bus 005 Device 002: ID 0525:a4a7 Netchip Technology, Inc. Linux-USB Serial Gadget (CDC ACM mode)
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

E você recebe dois novos nós de dispositivo, /dev/ttyGS0 de g_serial para o gadget e /dev/ttyACM0 do módulo cdc_serial carregado automaticamente que representa o dispositivo. Você pode testar se eles se comunicam escrevendo em um e lendo do outro.

Há também g_webcam a um driver UVC de gadget. Ele cria um novo dispositivo /dev/video* e, assim como /dev/ttyGS0 acima, você pode transmitir vídeo para este dispositivo para usar o gadget. E é isso que o programa de espaço de usuário uvc-gadget faz: ele usa uma imagem estática ou outro dispositivo UVC "real" existente e o transmite para o recém-criado /dev/video* , para que você possa alimentar seus dados reais do dispositivo USB e veja se ele sai corretamente no mestre USB que usa este dispositivo.

No entanto, parece que não funciona com o barramento dummy_hcd (tentei agora): assim como acima, um dispositivo segundo /dev/video* deve ser criado pelo módulo do kernel USB no lado mestre que usa a webcam. Isso não acontece; em vez disso, o sistema USB fica tão confuso depois de pouco tempo que não consigo mais usar meu teclado e mouse.

Portanto, g_webcam tem bugs, ou possivelmente o subsistema de vídeo tenta criar os dois dispositivos com o mesmo identificador e, em seguida, quebra ou talvez outra coisa. Não sei.

Portanto, ele pode funcionar apenas em um sistema embarcado real com um controlador de host real (escravo).

Então, sim, existem ferramentas disponíveis que podem fazer isso, mas infelizmente a simulação é problemática se você quiser que o dispositivo simulado apareça no mesmo computador (um PC comum). Pode ainda funcionar em um sistema embarcado (você não disse onde e como deseja usar o dispositivo emulado).

    
por 02.09.2018 / 07:59

Tags