v4l2loopback no Linux: instalação, persistência e erros comuns
O Linux não tem câmera virtual embutida. Aplicativos abrem um dispositivo como /dev/video0 e leem quadros dele, e o kernel espera que haja hardware real por trás. O v4l2loopback é um módulo de kernel que cria um dispositivo que se comporta como uma câmera, mas é alimentado por software.
Ele é a base de qualquer fluxo de trabalho com câmera virtual no Linux: OBS, pipelines de ffmpeg e o CamLooper escrevem todos em um dispositivo de loopback. Veja como configurá-lo direito.
Instalação
Instale o pacote DKMS para que o módulo seja recompilado automaticamente sempre que o kernel for atualizado:
# Debian / Ubuntu
sudo apt install v4l2loopback-dkms
# Fedora / RHEL
sudo dnf install v4l2loopback
# Arch
sudo pacman -S v4l2loopback-dkms
O DKMS importa aqui. Sem ele, o módulo é compilado contra o kernel que você tinha na hora da instalação, e a câmera virtual para de funcionar silenciosamente após a próxima atualização de kernel.
Carregar o módulo
sudo modprobe v4l2loopback
Confirme que o dispositivo existe:
lsmod | grep v4l2loopback
ls -l /dev/video*
Opções úteis ao carregá-lo:
sudo modprobe v4l2loopback \
devices=1 \
video_nr=10 \
card_label="Virtual Camera" \
exclusive_caps=1
video_nr=10fixa o dispositivo em/dev/video10para não colidir com uma webcam realcard_labeldefine o nome que os aplicativos exibem na lista de câmerasexclusive_caps=1é a opção decisiva — faz o dispositivo anunciar capacidade de captura apenas quando algo está escrevendo nele. Chrome, Firefox e vários aplicativos Electron ignoram dispositivos de loopback sem isso, e é por isso que uma câmera pode aparecer nov4l2-ctle sumir no navegador
Fazer sobreviver a uma reinicialização
O modprobe dura até você reiniciar. Dois arquivos tornam isso permanente:
# /etc/modules-load.d/v4l2loopback.conf
v4l2loopback
# /etc/modprobe.d/v4l2loopback.conf
options v4l2loopback devices=1 video_nr=10 card_label="Virtual Camera" exclusive_caps=1
O primeiro carrega o módulo no boot; o segundo fornece as opções. É muito comum escrever só o primeiro e depois se perguntar por que as opções sumiram.
Testar sem nenhum aplicativo
Envie um vídeo em loop para o dispositivo com ffmpeg:
ffmpeg -stream_loop -1 -re -i video.mp4 \
-f v4l2 -pix_fmt yuv420p /dev/video10
-re ajusta o ritmo do fluxo em tempo real (sem ele, o ffmpeg escreve o mais rápido que consegue e o resultado é inutilizável), -stream_loop -1 repete para sempre e yuv420p é o formato de pixel que consumidores de webcam esperam. Abra uma página de teste de webcam no navegador e você deve ver o vídeo.
Erros comuns
modprobe: ERROR: could not insert 'v4l2loopback': Required key not available
O Secure Boot está rejeitando o módulo não assinado. Ou você registra uma Machine Owner Key e assina o módulo, ou desativa o Secure Boot no firmware. Distribuições que fornecem uma versão assinada do módulo evitam isso por completo.
O módulo compila mas nenhum dispositivo /dev/video aparece
Veja dmesg | tail logo após o modprobe. Uma incompatibilidade de versão entre o módulo e o kernel em execução aparece aí, e é o sinal habitual de que o DKMS não recompilou após uma atualização.
A câmera existe mas os navegadores não a veem
Carregue o módulo com exclusive_caps=1. Essa é, de longe, a causa mais comum.
Aplicativos Flatpak não veem a câmera
O sandbox bloqueia o acesso a dispositivos até você conceder:
flatpak override --user --device=all com.obsproject.Studio
Pulando tudo isso
Tudo acima é uma configuração feita uma única vez, mas ainda assim é uma sessão de terminal e uma reinicialização antes de você conseguir reproduzir um vídeo como câmera — e é por isso que «é só usar o OBS» é um conselho mais difícil no Linux do que no Windows.
Os pacotes .deb e .rpm do CamLooper fazem isso por você. Eles declaram v4l2loopback-dkms como dependência, instalam os arquivos de modules-load.d e modprobe.d mostrados acima e carregam o módulo durante a instalação, então a câmera fica pronta quando o instalador termina e também depois de cada reinicialização. Sem terminal, sem reiniciar, e o DKMS a mantém funcionando entre atualizações de kernel.