v4l2loopback в Linux: установка, постоянство и типичные ошибки
В Linux нет встроенной виртуальной камеры. Приложения открывают устройство вроде /dev/video0 и читают из него кадры, а ядро ожидает за ним настоящее оборудование. v4l2loopback — это модуль ядра, который создаёт устройство, ведущее себя как камера, но получающее данные от программ.
Он лежит в основе любого сценария с виртуальной камерой в Linux: OBS, конвейеры ffmpeg и CamLooper пишут в петлевое устройство. Вот как настроить его правильно.
Установка
Установите пакет DKMS, чтобы модуль автоматически пересобирался при каждом обновлении ядра:
# Debian / Ubuntu
sudo apt install v4l2loopback-dkms
# Fedora / RHEL
sudo dnf install v4l2loopback
# Arch
sudo pacman -S v4l2loopback-dkms
DKMS здесь важен. Без него модуль собирается под то ядро, которое было на момент установки, и ваша виртуальная камера незаметно перестаёт работать после следующего обновления ядра.
Загрузка модуля
sudo modprobe v4l2loopback
Убедитесь, что устройство появилось:
lsmod | grep v4l2loopback
ls -l /dev/video*
Полезные параметры при загрузке:
sudo modprobe v4l2loopback \
devices=1 \
video_nr=10 \
card_label="Virtual Camera" \
exclusive_caps=1
video_nr=10закрепляет устройство за/dev/video10, чтобы оно не конфликтовало с настоящей веб-камеройcard_labelзадаёт имя, которое приложения показывают в списке камерexclusive_caps=1— ключевой параметр: устройство сообщает о возможности захвата только тогда, когда в него что-то пишет. Chrome, Firefox и ряд приложений на Electron игнорируют петлевые устройства без него — именно поэтому камера может быть видна вv4l2-ctlи отсутствовать в браузере
Как пережить перезагрузку
modprobe действует только до перезагрузки. Постоянным его делают два файла:
# /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
Первый загружает модуль при старте системы, второй передаёт ему параметры. Часто пишут только первый, а потом удивляются, куда делись настройки.
Проверка без единого приложения
Подайте зацикленное видео в устройство через ffmpeg:
ffmpeg -stream_loop -1 -re -i video.mp4 \
-f v4l2 -pix_fmt yuv420p /dev/video10
-re задаёт темп потока в реальном времени (без него ffmpeg пишет с максимальной скоростью, и результат непригоден), -stream_loop -1 повторяет бесконечно, а yuv420p — это формат пикселей, которого ждут потребители веб-камеры. Откройте страницу проверки веб-камеры в браузере — там должно появиться видео.
Типичные ошибки
modprobe: ERROR: could not insert 'v4l2loopback': Required key not available
Secure Boot отклоняет неподписанный модуль. Либо зарегистрируйте Machine Owner Key и подпишите модуль, либо отключите Secure Boot в прошивке. Дистрибутивы, поставляющие подписанную сборку модуля, избавляют от этой проблемы полностью.
Модуль собирается, но устройство /dev/video не появляется
Посмотрите dmesg | tail сразу после modprobe. Там видно несоответствие версий модуля и работающего ядра — обычный признак того, что DKMS не пересобрал модуль после обновления.
Камера есть, но браузеры её не видят
Загрузите модуль с exclusive_caps=1. Это с большим отрывом самая частая причина.
Приложения Flatpak не видят камеру
Песочница блокирует доступ к устройствам, пока вы его не выдадите:
flatpak override --user --device=all com.obsproject.Studio
Как обойтись без всего этого
Всё вышеописанное делается один раз, но это по-прежнему сеанс в терминале и перезагрузка до того, как вы сможете воспроизвести видео как камеру, — и именно поэтому совет «просто возьми OBS» в Linux даётся тяжелее, чем в Windows.
Пакеты .deb и .rpm CamLooper делают это за вас. Они объявляют v4l2loopback-dkms зависимостью, устанавливают показанные выше файлы modules-load.d и modprobe.d и загружают модуль во время установки, так что камера готова сразу после завершения установщика и снова после каждой перезагрузки. Без терминала, без перезагрузки, а DKMS поддерживает её работоспособность при обновлениях ядра.