>> Tecnologia Eletrônica >  >> Câmeras >> Reparo de Câmeras

Solucionar Captura de Vídeo no Linux: v4l2, GStreamer, OBS e Depuração do Kernel

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.

Camada 0: Hardware e Kernel (O dispositivo existe?)

# 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.

Camada 1: Controles V4L2 (Capacidades e Formatos)

# 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.

Camada 2: GStreamer (O Pipeline de Mídia)

# 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

Camada 3: Aplicação (OBS, Navegador, Zoom)

OBS Studio (Flatpak Preferido)

  • Fonte: Dispositivo de Captura de Vídeo (V4L2) — NÃO "Dispositivo de Captura de Vídeo (V4L2) [Obsoleto]".
  • Dispositivo: /dev/video0 (ou índice correto).
  • Resolução/FPS: Personalizado → Correspondam exatamente a um modo do v4l2-ctl --list-formats-ext. (ex.: 1920x1080 @ 30.000 fps MJPG).
  • Espaço de Cor: 709. Faixa de Cor: Parcial.
  • Buffering: Desativado (menor latência) ou Automático.
  • Wayland: OBS Flatpak + PipeWire → Captura de Tela (PipeWire) funciona. Para webcam, V4L2 funciona nativamente.
  • Permissão: Flatpak: flatpak override --device=all com.obsproject.Studio ou --device=/dev/video0.

Navegador (Chrome/Firefox) — WebRTC getUserMedia

  • Teste: webcamtests.com ou chrome://settings/content/camera.
  • Se o navegador vê o dispositivo mas o OBS não → Problema no PipeWire / WirePlumber. Garanta pipewire, wireplumber, libpipewire-0.3-modules, gst-plugin-pipewire instalados.
  • Firefox: media.navigator.mjs.enabled = true em about:config (para MJPEG/H264).

Camada 4: Modos Comuns de Falha e Correções

SintomaDiagnósticoCorreção
Imagem Verde/Roxa/RosaMismatch 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 travandov4l2-ctl -d /dev/video0 -c exposure_auto=1 -c exposure_absolute=156 (manual). white_balance_temperature_auto=0.
"Dispositivo Ocupado" / EBUSYOutro 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 DetectadaMó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.

Avançado: Cálculo de Largura de Banda USB

# 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.

Logs para Relatórios de Bug

# 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).