[HOWTO]Веб камера в нескольких приложениях одновременно

Задался целью: "научить" камеру работать сразу в нескольких приложениях. По дефолту при подключении камеры появляется девайс /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 - виртуальная камера. так как модуль будет грузится при запуске системы, то виртуальное устройство будет всегда первым нежели остальные устройства. После чего перезагружаемся и радуемся работе камеры во всех приложениях одновременно)))

ЗЫ если есть ошибки в коде или в командах прошу поправить, писал на скорую руку)

Комментарии (13)

0
dyug - 11 Январь, 2013 - 11:23

О! Сделали! Не прошло и 10 лет... :-)
предыдущая версия для видео4линух первой версии лежит здесь
можно увидеть changelog :-)
обратите внимание на года. :-)

0
Гость - 14 Август, 2016 - 20:39

Всё написано хорошо! Вот только у меня с /dev/video0 на /dev/video1 не перекидывается изображение хотя ошибок никаких не выдаёт.

0
kot040188 - 14 Август, 2016 - 21:10
Изображение пользователя kot040188.

А есть решение гораздо проще — OBS.

0
dyug - 15 Август, 2016 - 10:57

Odna Babka Skazala?

0
lord_i - 15 Август, 2016 - 21:58
Изображение пользователя lord_i.

Гм... А как можно сравнивать драйвер с многомегабайтным софтом? И как прикладной софт может быть проще драйвера???

0
kot040188 - 15 Август, 2016 - 22:18
Изображение пользователя kot040188.

Можно. Если нужен результат, а не возня с граблями. Но на самом деле, я сравниваю не инструмент, а результат. Я бы не рискнул проделывать то, о чём говорится в статье. Наверняка ведь грабли будут, индивидуальные для каждой системы, я хвостом чую. Ах да, вот они:
Всё написано хорошо! Вот только у меня с /dev/video0 на /dev/video1 не перекидывается изображение хотя ошибок никаких не выдаёт.
Ну не сейчас так в следующей версии бубунты. А могут вообще выбросить эти пакеты на мороз (в первый раз что ли?). "…Можно подгрузить… можно попробовать… писал на скорую руку…" — написано, как-будто автор сам неуверен в том, что делает и взлетит ли это на чужой системе. А OBS, я уверен, взлетит на любой системе и настроит его каждый новичок.

0
dyug - 16 Август, 2016 - 10:23

кот у нас так и не желает понимать, что "одна бабка сказала" - это не название софта, а просто флуд.

К тому же, я так думаю, что сей OBS (что это такое, один кот знает) врядли может пригодиться в решении получения и видеовывода в реальном масштабе времени , и одновременной обработки данного видеосигнала, что и является основной задачей vidoloopback

0
kot040188 - 16 Август, 2016 - 11:16
Изображение пользователя kot040188.

охота вести трансляцию и при этом ее записывать
Эта цель легко достижима с OBS, для этого оно и разработано. Других целей не озвучено и я не смог придумать (я не отрицаю их существование). Для тех кого забанил гугл, первая ссылка в яндексе. Я никого не заставляю пользоваться. Но кому-нибудь пригодится этот вариант, я уверен.

0
dyug - 16 Август, 2016 - 12:10

кот еще подложник...
Выдал свою фразу за цитату от меня...

0
kot040188 - 16 Август, 2016 - 12:37
Изображение пользователя kot040188.

Где в цитате написано ваше имя? "Вы неисправимый фантазёр" ©

0
Гость - 16 Август, 2016 - 18:45

кот, спасибо за наводку.

0
kot040188 - 16 Август, 2016 - 19:13
Изображение пользователя kot040188.

Всегда пожалуйста.

0
Гость - 14 Февраль, 2017 - 12:06

А этот v4l2loopback без г-стримера разве сам не умеет перекидывать с /dev/video0 на его виртуальный /dev/video1 ?