A captura de vídeo no Linux falha silenciosamente ou com erros criptográficos. A pilha é Kernel (V4L2) → Biblioteca de Espaço de Usuário (libv4l, GStreamer, FFmpeg) → Aplicação (OBS, Zoom, Navegador). Uma quebra em qualquer camada interrompe o fluxo. Apresentamos aqui o protocolo de diagnóstico sistemático.
# 1. Enumeração USB
lsusb -t | grep -i video
# Procure seu dispositivo (ex.: 046d:0825 Logitech C920) com "If# 0" e "If# 1" (Vídeo + Áudio)
# Se ausente: cabo ruim, porta, hub sem energia ou dispositivo morto.
# 2. Nós de Dispositivo V4L2
ls -l /dev/video*
# Deve aparecer /dev/video0, /dev/video1... (video0 geralmente webcam, video1 metadados)
# Se vazio: driver não carregado ou bind falhou.
# 3. Mensagens do Kernel (A Verdade)
dmesg -T -k | grep -i -e usb -e video -e uvc -e v4l
# Procure por: "uvcvideo: Found UVC 1.00 device", "uvcvideo: Failed to query (GET_DEF) UVC control"
# Erro comum: "uvcvideo: Failed to set UVC probe control" → Problema de largura de banda/alt setting.
# 4. Verificar Módulos Carregados
lsmod | grep -E 'uvc|videodev|v4l2'
# uvcvideo, videobuf2_v4l2, videobuf2_common, videodev devem estar presentes.
# Instalar ferramentas
sudo apt/dnf/pacman install v4l-utils gstreamer1.0-tools
# 1. Listar Dispositivos e Capacidades
v4l2-ctl --list-devices
v4l2-ctl -d /dev/video0 --all
# Saída mostra: Driver, Card, Bus, Capabilities (Video Capture, Streaming, Device Capabilities)
# Formatos: [0]: 'YUYV' (YUYV 4:2:2) / [1]: 'MJPG' (Motion-JPEG) / [2]: 'H264' / [3]: 'YV12' / [4]: 'NV12'
# Tamanhos de Frame e Intervalos para CADA formato. ANOTE-OS.
# 2. Testar Captura Bruta (Ignorar App)
# YUYV (Não comprimido) - 10 frames para /dev/null
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=YUYV --stream-mmap --stream-count=10 --stream-to=/dev/null
# MJPG (Comprimido) - geralmente FPS mais alto
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=MJPG --stream-mmap --stream-count=10 --stream-to=/dev/null
# H.264 (Codificado por Hardware) - se suportado
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=H264 --stream-mmap --stream-count=10 --stream-to=test.h264
Se v4l2-ctl --stream-to funciona → Kernel/Driver OK. O problema está no Espaço de Usuário/App.
# Pipeline de Teste (Auto-negociação)
gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! autovideosink
# Formato Explícito (Forçar MJPG 1080p60)
gst-launch-1.0 v4l2src device=/dev/video0 ! \
"image/jpeg,width=1920,height=1080,framerate=60/1" ! \
jpegdec ! videoconvert ! autovideosink
# Decodificação H.264 por Hardware (Intel/AMD VAAPI / Nvidia NVDEC)
gst-launch-1.0 v4l2src device=/dev/video0 ! \
"video/x-h264,width=1920,height=1080,framerate=60/1" ! \
h264parse ! vaapih264dec ! videoconvert ! autovideosink
# Intel/AMD
# ou
gst-launch-1.0 v4l2src device=/dev/video0 ! \
"video/x-h264,width=1920,height=1080,framerate=60/1" ! \
h264parse ! nvh264dec ! videoconvert ! autovideosink
# Nvidia
# Listar Propriedades GStreamer para o Dispositivo
gst-device-monitor-1.0 Video/Source
/dev/video0 (ou índice correto).v4l2-ctl --list-formats-ext. (ex.: 1920x1080 @ 30.000 fps MJPG).flatpak override --device=all com.obsproject.Studio ou --device=/dev/video0.chrome://settings/content/camera.pipewire, wireplumber, libpipewire-0.3-modules, gst-plugin-pipewire instalados.media.navigator.mjs.enabled = true em about:config (para MJPEG/H264).| Sintoma | Diagnóstico | Correção |
|---|---|---|
| Imagem Verde/Roxa/Rosa | Mismatch de Formato de Pixel (YUYV vs NV12 vs RGB) | Forçar formato no app: v4l2-ctl --set-fmt-video=pixelformat=YUYV ou MJPG. No OBS: tente "YUYV 4:2:2" ou "MJPEG". |
| Tela Preta / "Nenhum frame recebido" | Largura de Banda Excedida (hub USB 2.0, múltiplas câmeras) | Porta USB 3.0 (azul). Direto no root hub. Reduzir resolução/fps. Quirks do uvcvideo: modprobe uvcvideo quirks=128 (forçar 500MHz). |
| FPS Baixo (10fps @ 1080p) | Auto-exposição / Auto-white-balance travando | v4l2-ctl -d /dev/video0 -c exposure_auto=1 -c exposure_absolute=156 (manual). white_balance_temperature_auto=0. |
| "Dispositivo Ocupado" / EBUSY | Outro processo segura o dispositivo (Cheese, Zoom, GPhoto2) | lsof /dev/video0 → Matar PID. systemctl stop gdm (se display manager o segura). |
| Controles Ausentes (Brilho/Contraste) | Driver não expõe UVC XU (Extension Units) | Use guvcview (GUI) ou uvcdynctrl (CLI) para controles específicos Logitech/Microsoft. |
| Placa de Captura Não Detectada | Módulo do Kernel Ausente (Blackmagic, AVerMedia, Elgato) | dkms status → Instalar blackmagic-desktop-video-dkms, avermedia-dvb-dkms, elgato-gchd-dkms. Secure Boot pode bloquear módulos não assinados → mokutil --disable-validation ou assinar. |
# Verificar Topologia do Barramento USB
lsusb -t
# Observe "480 Mbps" (USB 2.0) vs "5000 Mbps" (USB 3.0) vs "10000 Mbps" (USB 3.1/3.2)
# Largura de Banda do Endpoint Isochronous UVC:
# YUYV 1920x1080@30 = ~1.2 Gbps → **Requer USB 3.0**
# MJPG 1920x1080@30 = ~150 Mbps → Funciona no USB 2.0 (no limite)
# Se em hub USB 2.0: FORÇAR MJPG.
# Debug do Driver UVC
sudo modprobe -r uvcvideo
sudo modprobe uvcvideo trace=0xFFFF
# Loga todas as requisições UVC
dmesg -wH
# Assista ao vivo. Reproduza a falha. Capture dmesg.
# Reporte para linux-media@vger.kernel.org / bug tracker da distro.
Regra de Ouro: v4l2-ctl --stream-to=/dev/null funciona → Kernel OK. App falha → Negociação de formato / Permissão / PipeWire. Corrija a negociação (caps explícitos no GStreamer/OBS).
Tecnologia Eletrônica © [www.351231.com]