Задался целью: "научить" камеру работать сразу в нескольких приложениях. По дефолту при подключении камеры появляется девайс /dev/video*, и если какое-то приложение его юзает (например Skype), то для других это устройство выдает черный экран. Как быть если например охота вести трансляцию и при этом ее записывать? Оказалось не все так сложно как казалось изначально))). Для решения данной задачи нам потребуется модуль v4l2loopback, который создаст виртуальное устройство, и в который будет "лупить" видео поток с камеры. Начнем! ;)
Для начала установим сам модуль
sudo apt-get install v4l2loopback-dkms
Далее можно его подгрузить
modprobe v4l2loopback
После чего должно появиться новое устройство, у меня оно называется /dev/video1, так как /dev/video0 - это камера (у вас нумерация может быть другой, учитываем это)
Что бы не набирать эту команду каждый раз после загрузки, сделаем так, что бы модуль грузился автоматом
sudo nano /etc/modules
добавляем строку
v4l2loopback
После чего ставим пакет gst-launch-0.10
sudo apt-get install gst-launch-0.10
Вот теперь мы подходим к самому интересному. Можно попробовать пере направить поток с камеры на наш виртуальный девайс
gst-launch v4l2src device=/dev/video0 ! videorate ! video/x-raw-yuv,width=640,height=480 ! v4l2sink device=/dev/video1
Где /dev/video0 - камера, /dev/video1 - виртуальная камера. width=640,height=480 - ширина и высота потока с камеры (тут хотел бы пояснить, как я выяснил если в программе принудительно выставить разрешение камеры то это игнорируется, и поток идет с максимальным разрешением камеры, что неудобно для работы с такими программами как motion. Если же ограничения не нужны, то опцию "video/x-raw-yuv,width=640,height=480" можно просто напросто вырезать). Если терминал не выдал ни каких ошибок, то поток пошел на виртуальную камеру, можем проверить это запустив какие ни будь программы использующие камеры одновременно и выбрать /dev/video1.
Радуемся. НО! Нам конечно бы хотелось получить это при загрузке, не вводя ни каких команд. Для этого редактируем файл
sudo nano /etc/rc.local
и перед строкой "exit 0" вставляем
gst-launch v4l2src device=/dev/video1 ! videorate ! video/x-raw-yuv,width=640,height=480 ! v4l2sink device=/dev/video0
Обратите внимание, что теперь устройства поменялись местами. /dev/video1 - камера, а /dev/video0 - виртуальная камера. так как модуль будет грузится при запуске системы, то виртуальное устройство будет всегда первым нежели остальные устройства. После чего перезагружаемся и радуемся работе камеры во всех приложениях одновременно)))
ЗЫ если есть ошибки в коде или в командах прошу поправить, писал на скорую руку)