LINUX.ORG.RU

Запись видеопотока в виртуальное устройство v4l2loopback

 ,


1

2

Суть такова, есть такой проект v4l2loopback, который представляет собой модуль ядра, который создаёт виртуальные V4L2 устройства, и в них можно писать видео и читать его обратно другими программами

https://github.com/umlaeute/v4l2loopback/

Проблема в том, что в документации V4L2 нету примеров кода для работы с OUTPUT девайсами, только разрозненные рекомендации в описаниях ioctl-ов. Примеры есть только для capture девайсов.

И когда я делаю тестовую программу, использующую mmap метод для записи в сабжевый виртуальный девайс, на выходе читается только первый кадр, дальше чтение виснет. Когда я использую метод write(), то всё работает, но выстреливает кадры на максимальной скорости, ибо таймстампы и другая метаинформация в этом режиме не поддерживается.

Подозреваю, что в v4l2loopback кривая и бажная реализация получения кадров через mmap, а мой код всё делает правильно, как в мануале. Но полностью в этом не уверен, ибо железных V4L2 ouput девайсов у меня в наличии нету и протестировать не могу, чтобы сравнить результаты.

Собственно, кому-нибудь из ЛОРовцев приходилось писать видео в V4L2 девайсы используя mmap (Streaming I/O в терминах V4L2)?

Примеры кода не гуглятся

★★★★★
Ответ на: комментарий от anonymous

спасибо, добрый анонимус :)

подозрения подтвердились, с этим кодом тоже читается только один кадр

надо ловить баг в модуле

P.S. а этот код точно работал? ;)

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

надо ловить баг в модуле

проверь gstreamer-ом - там есть v4l2sink

P.S. а этот код точно работал? ;)

Не знаю - я его нагуглил. У меня есть реальное устройство, могу проверить, но по опыту v4l2 вообще плохо предсказуемая вещь. Например с тем устройством что у меня есть не работает стандартный плагин gstreamer но прекрасно работает мой код.

anonymous
()
Ответ на: комментарий от Harald
sudo modprobe v4l2loopback devices=4
gst-launch -v videotestsrc ! "video/x-raw-yuv,width=720,height=576,framerate=30/1,format=(fourcc)I420" ! v4l2sink device=/dev/video0

Так получится изображение и там будет прекрасное тестовое видео. Посмотреть V4L2 потоки можно тупо через vlc-плеер.

Так ты сможешь отлаживать v4l2 программы не имея реального устройства. В драйвере v4l2loopback бага скорее всего нет, причем этот драйвер можно ставить не только из исходников, но и прямо с репозитория (например у Ubuntu есть).

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

шаманство, с gstreamer-ом и v4l2sink-ом работает :)

буду ковырять исходники на предмет что там иначе сделано, чем у меня

Harald ★★★★★
() автор топика

Причину нашёл,

оказывается, v4l2loopback после ioctl(VIDIOC_DQBUF) выставляет значение buf.type в V4L2_BUF_TYPE_VIDEO_CAPTURE, и соответственно при следующем ioctl(VIDIOC_QBUF) драйверу передаётся неправильный тип буфера, если buf.type заново не проинициализировать значением V4L2_BUF_TYPE_VIDEO_OUTPUT

С одной стороны v4l2loopback кривое поделие, обычные драйверы реальных устройств так делать не будут (нет причины), с другой стороны вроде бы в документации V4L2 нигде не сказано, что значение buf.type после возврата из ioctl(VIDIOC_DQBUF) будет сохраняться

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