Веб-камера в Linux чаще всего заводится сама: ядро определяет её как USB Video Class, загружает модуль uvcvideo, и в системе появляется /dev/video0. Трудности начинаются, когда нужен не «видеозвонок вообще», а конкретное разрешение, частота кадров или запись без рывков. Здесь помогает v4l2 — подсистема Video4Linux2, единый интерфейс, через который приложение получает кадры. Ниже — проверка устройства, разбор форматов, запись и разбор типовых сбоев.
Как ядро видит камеру
UVC-камера не требует отдельного драйвера под каждую модель: производитель следует стандарту, а ядро предоставляет общий драйвер. Проверка начинается с четырёх шагов: список USB-устройств, сообщения ядра, узлы устройств и перечень устройств v4l2. В нормальном случае рядом с /dev/video0 может появиться /dev/video1 — второй узел нужен для метаданных или второй функции, и путать их не стоит.
lsusb
sudo dmesg | grep -i -E "uvc|video"
ls -l /dev/video*
v4l2-ctl --list-devices
У встроенных камер всё чаще встречается media controller: узел /dev/media0 описывает граф из сенсора, ISP и блоков захвата, а видео появляется только после сборки цепочки. Топологию показывает media-ctl -p, текущие параметры потока — v4l2-ctl --all. Если узлов нет, начинать нужно с dmesg, а не с настроек приложения.
Вывод v4l2-ctl --list-devices показывает, какие узлы относятся к какой камере. У ноутбуков с камерой, подключённой не по USB, а через MIPI, картина бывает другой: устройство может обслуживаться libcamera и программным ISP, и тогда /dev/video* появится только после загрузки нужных модулей. Это важно помнить, прежде чем искать неисправность в железе.
Форматы и пропускная способность
Камера предлагает несколько форматов, и выбор между ними — не косметика. YUYV передаёт несжатые кадры: на пиксель приходится два байта, и при 1280×720 и 30 кадрах в секунду только полезные данные занимают около 55 МБ/с. Практическая пропускная способность USB 2.0 ниже, поэтому камера честно предложит 640×480 или уменьшит частоту. MJPEG сжимает каждый кадр отдельно и укладывается в тот же канал с большим запасом, но требует больше процессорного времени на распаковку.
v4l2-ctl -d /dev/video0 --list-formats-ext
v4l2-ctl -d /dev/video0 --get-fmt-video
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1280,height=720,pixelformat=MJPG
v4l2-ctl -d /dev/video0 --set-parm=30
Ключ к разгадке «почему только 640×480» обычно лежит именно в этом выводе: высокое разрешение доступно только для MJPEG или H.264, а приложение по умолчанию просит YUYV. Второй распространённый случай — камера подключена через USB-хаб вместе с другим устройством, и на двоих не хватает полосы.
Отдельная тонкость — четырёхбуквенные идентификаторы: MJPEG в v4l2 называется MJPG, а H.264 может скрываться за H264. Приложение поддерживает не все варианты, поэтому проверка через ffmpeg остаётся самым надёжным тестом.
Запись и быстрая проверка картинки
Для проверки не нужен редактор: достаточно ffmpeg, который умеет читать v4l2 напрямую. Явно указав формат входа, вы исключаете подмену на лету и видите реальные параметры. Если картинка зелёная или рассыпается, почти всегда виновато несоответствие формата, а не сама камера.
ffmpeg -f v4l2 -input_format mjpeg -video_size 1280x720 \
-framerate 30 -i /dev/video0 -t 10 -c:v libx264 -preset veryfast test.mp4
ffplay -f v4l2 -input_format mjpeg -video_size 1280x720 -framerate 30 /dev/video0
ffmpeg -f v4l2 -i /dev/video0 -frames:v 1 snapshot.jpg
Записывать в H.264 стоит для архива, а для быстрой диагностики хватит и одного кадра. Если файл слишком большой, уменьшайте битрейт через -b:v, а не разрешение. Проверять лучше при том освещении, при котором камера будет работать: автоматическая экспозиция на дешёвых модулях выходит на режим несколько секунд, и первые кадры выглядят тёмными.
Права и доступ
Узлы /dev/video* принадлежат группе video. Если камера видна, но приложение получает отказ, пользователя добавляют в группу и перезаходят в сессию. Для Flatpak доступ идёт через портал, и разрешение выдаётся в настройках приложения, а не в группе.
ls -l /dev/video0
sudo usermod -aG video "$USER"
id -nG
sudo apt install v4l-utils ffmpeg
Проверка id -nG должна показать video. Если этого не произошло, сессия не перечитала группы: помогает выход из системы, а не перезапуск терминала.
Энергосбережение и стабильность
Если камера пропадает после простоя, чаще всего виноват autosuspend USB. Проверить параметр и отключить сон для конкретного устройства можно правилом udev; для диагностики достаточно отключить энергосбережение контроллера целиком.
cat /sys/module/usbcore/parameters/autosuspend
lsusb -t
udevadm info -a -n /dev/video0 | grep -i power
Типичные проблемы
- Нет /dev/video. Смотрите dmesg: сообщения об ошибке USB, нехватке питания или отвалившемся устройстве. Другой порт и другой кабель решают половину случаев.
- Устройство занято. Приложение не отпустило поток.
fuser -v /dev/video0иlsof /dev/video0показывают виновника. - Только 640×480. Приложение просит YUYV; принудительно задайте MJPEG или проверьте полосу USB.
- Зелёный или розовый кадр. Несовпадение формата или известная ошибка модуля; помогает смена формата и проверка в другом приложении.
- Камера пропадает через минуту. Энергосбережение USB: проверьте
dmesgи отключите autosuspend для этого устройства. - Несколько узлов. Захват обычно на video0, а video1 может быть метаданными; перебор узлов ничего не ломает.
- Картинка дёргается. Не хватает полосы USB или процессора на распаковку MJPEG; снизьте разрешение или частоту.
- Виртуальная машина не видит камеру. Пробросьте USB-устройство целиком, а не только видеоузел.
Браузеры и видеоконференции
Современные браузеры получают камеру через PipeWire и xdg-desktop-portal. Если в системе сайт не видит устройство, а ffmpeg его открывает, проблема почти всегда в портале или в разрешении для конкретного браузера. Проверять стоит в чистом профиле: расширения иногда блокируют доступ. В Firefox и Chromium выбор устройства находится в настройках сайта, и после смены камеры разрешение нужно выдать заново. Если браузер установлен как Flatpak, проверьте доступ к камере в его настройках разрешений.
Итог
Порядок разбора простой: lsusb и dmesg подтверждают, что устройство живо, а политика безопасности не блокирует узел; v4l2-ctl показывает узлы и форматы; ffmpeg проверяет реальную картинку. Если камера работает в ffmpeg, но не в браузере, ищите причину в портале и правах. Если не работает нигде — смотрите формат, полосу USB и питание. Такой чек-лист закрывает большинство обращений без переустановки системы и замены железа.