LINUX.ORG.RU

Ретрансляция /dev/video


0

1

Нужен доступ к /dev/video одновременно двум програмам. Хочется что-то типа

mkfifo pipe
cat /dev/video0 &
и в одной программе читать из /dev/video0, а в другой - из pipe

но при попытке так сделать, возникает ошибка

cat: /dev/video0: Недопустимый аргумент

что делать?


Программы меняют состояние устройства и/или драйверов при открытии устройства и работе с ним. Устройство не может быть в двух состояниях одновременно, поэтому доступ ко многим устройствам более одной программы за раз исключён. Используй диспетчеры, WebcamStudio или Manycam.

auto12884835
()
Ответ на: комментарий от auto12884835

жаль. тогда так спрошу:

есть программа на qt4, которая выводит изображение с вебки на виджет приложения. нужно при нажатии на кнопку записи записывать через ffmpeg в файл. как это сделать?

как вариант, можно копировать текущее изображение в пайп, и потом прописать ffmpeg брать видео из пайпа. но я не знаю как засунуть изображение в пайп

memnek
() автор топика
Ответ на: комментарий от memnek

Ты хочешь одновременно показывать текущее изображение и записывать его в одном и том же приложении? Тогда никаких извращений не нужно. Используй видео оверлей.

auto12884835
()
Ответ на: комментарий от auto12884835

правильно ли я понимаю:

1) нужно сделать что-то на подобии такого:

struct v4l2_window *window;
ioctl(device, VIDIOC_OVERLAY, &window);
и потом брать данные для отображения из поля в переменной window

2) как мне потом записывать само видео? оно будет дотупно из внешней программы или нужно записывать средствами v4l2 в моей программе?

memnek
() автор топика
Ответ на: комментарий от memnek

можно и по-другому сделать: запихнуть буфер с изображениями в разделяемую память. В итоге все, кому надо, смогут иметь доступ к видео (я так делал в веб-морде спектрографа).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от auto12884835

я нашёл пример работы с оверлеем. при запуске тестовой программы выпадает ошибка, что моё устройство не является «video overlay device». что делать в таком случае?

memnek
() автор топика
Ответ на: комментарий от memnek

нет, зачем. Тебе надо будет сперва опросить возможность V4L2_CAP_VIDEO_OVERLAY при помощи VIDIOC_QUERYCAP ioctl. Если драйвер не умеет оверлея, выкручиваться как-то по-другому, уж как сумеешь. Отрисовывать на виджете захваченные кадры например. Потеряешь в быстродействии и нагрузишь проц, но хотя бы будет работать. Потом установить параметры фреймбуфера, потом сконфигурировать окно и по готовности активировать. Только для VIDIOC_OVERLAY ioctl не нужно структуры в качестве параметра. вот же.

2) как мне потом записывать само видео? оно будет дотупно из внешней программы или нужно записывать средствами v4l2 в моей программе?

я же тебе сказал, из другой программы это устройство не будет доступно. Для записи ты ffmpeg хотел использовать. Он годится. Только дважды не открывай устройство, используй один и тот же fd.

auto12884835
()
Ответ на: комментарий от memnek

моё устройство не является «video overlay device». что делать в таком случае?

флаг V4L2_CAP_VIDEO_OVERLAY установлен? Если нет, то твоё устройство не поддерживает оверлея. Проверь, правильно ли определила это твоя тестовая программа. Например, при помощи «xawtv -hwscan». Для способных к оверлею устройств будет выведено «flags: overlay...». Если он действительно недоступен, тогда остаётся только отрисовывать полученные фреймы на виджете вручную как битмапы, и их же потом кодировать и записывать.

auto12884835
()
Ответ на: комментарий от memnek

Тогда как раз годится использование своих буферов.

Если планируешь вывод в веб делать, есть смысл в буфере хранить сразу же jpeg (чтобы клиенты не нагружали сильно сервер). Если в OpenGL — хранить в несжатом виде. А чтобы клиент знал, в каком из буферов лежит текущая картинка, в еще одной области разделяемой памяти хранить номер текущего буфера. В клиенте проверять номер на допустимость (все-таки, процесс чтения-записи получается конкурентным — здесь либо тормозящие блокировки использовать, либо наплевать, что иногда будет появляться устаревший кадр; в случае с простой трансляцией видео второй способ годится).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от auto12884835

проверил, оверлей не поддерживается, только capture. значит буду выкручиваться.

memnek
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.