Запуск двух устройств v4l2loopback с их индивидуальными свойствами - PullRequest
0 голосов
/ 29 мая 2020

Работая с устройствами v4l2loopback, я могу запустить эти два виртуальных устройства:

a) запуск изображения предварительного просмотра с цифровой зеркальной камеры Canon через USB через v4l2loopback в OBS:

modprobe v4l2loopback
gphoto2 --stdout --capture-movie | gst-launch-1.0 fdsrc fd=0 ! decodebin name=dec ! queue ! videoconvert ! tee ! v4l2sink device=/dev/video0

Найдено здесь , и это работает.

b) Потоковая передача вывода OBS в систему конференц-связи на основе браузера, например:

modprobe v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1

Найдено здесь, это тоже работает.

Однако мне нужно запустить одновременно a) и , что не работает должным образом. Они мешают, похоже, они используют тот же буфер, в котором видео переключается между двумя производителями.

Что я узнал и попробовал: модуль ядра можно загрузить только один раз. Модуль v4l2loopback можно выгрузить с помощью команды modprobe -r v4l2loopback. Я не знаю, будет ли проигнорирована загрузка его во второй раз или выгружена предыдущая.

Я пытался загрузить модуль с помощью devices=2 в качестве опции , а также разные видеоустройства, но я не могу найти правильный синтаксис.

1 Ответ

1 голос
/ 30 мая 2020

из вашего описания («видео переключается между двумя производителями») кажется, что оба производителя записывают на одно и то же видеоустройство.

чтобы исправить это, вам нужно сделать две вещи :

  • создать 2 видеоустройства
  • указать каждому производителю использовать собственное видеоустройство

создание нескольких видеоустройств

как задокументировано , это можно сделать, указав devices=2 при загрузке модуля.

принимая ваш вызов modprobe, это будет означать:

modprobe v4l2loopback devices=2 video_nr=10 card_label="OBS Cam" exclusive_caps=1

это создаст два новых устройства, первое будет /dev/video10 (раз вы указали video_nr), второе займет первое бесплатное видео-устройство. в моей системе (в которой есть веб-камера, которая занимает как /dev/video, так и /dev/video1) это /dev/video2

говорит каждому производителю использовать свое собственное устройство

ну, скажите одному производителю использовать /dev/video10, а другой - использовать /dev/video2 (или любые другие видеоустройства, которые у вас есть)

например,

gphoto2 --stdout --capture-movie | gst-launch-1.0 \
       fdsrc fd=0  \
       ! decodebin name=dec  \
       ! queue  \
       ! videoconvert  \
       ! tee  \
       ! v4l2sink device=/dev/video10

и настроить obs для использования /dev/video2.

или наоборот.

просто не используйте одно и то же видеоустройство для обоих производителей. (также убедитесь, что ваши потребители используют правильное видеоустройство)

...