LINUX.ORG.RU

Библиотека видеозахвата (вроде cvcam)


0

0

Есть ли универсальная библиотека видеозахвата? В описании openCV я прочитал, что была такая cvcam, но уже не поддерживается.

Что мне нужно: реализовать посредством минимального количества кода в приложении захват фрейма с tv-тюнера, фреймграббера, веб-камеры - в общем, любого устройства v4l2. Просто надоело уже переписывать код для разных устройств: сначала я написал захват видео с tv-тюнера. Потом у меня возникла необходимость захватывать с веб-камеры, которая отдает фреймы, сжатые jpeg'ом. Если принесут еще какое-нибудь другое устройство, придется переписывать для него...

Хочется же, чтобы библиотека при инициализации устройства автоматически определяла, что это за устройство и каковы у него параметры, выбирала наиболее подходящий метод считывания и формат видео (если их несколько). Т.е. нужно реализовать функционал того же mplayer'а при просмотре mplayer tv://

☆☆☆☆☆

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

+
можно вспомнить qtишный phonon, который если правильно помню,
пользует gstreamer и является «имитацией» оффтопного DirectShow

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

http://libavcap.sourceforge.net/ от http://ente.informatik.tu-freiberg.de/mist/

Второе - не то, что нужно. Первое похоже, но непонятно, как им пользоваться? Примеры есть? Что-то в мануале слишком много функций, а нужно всего две: 1) инициализация устройства, 2) считывание очередного кадра.

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

gstreamer

Уж очень «жирная» библиотека. И тоже нет нужного функционала.

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

Пиши под V4L2, юзай LD_PRELOAD=/path/to/libv4l2convert.so

А где почитать документацию по libv4l2convert: какие функции вызывать?

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

Никакие. Оно прозрачно сидит между программой и ядром, перехватывая нужные сисколлы и преобразуя фактические форматы в требуемые.

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

Т.е. будет декодировать jpeg'и, преобразовывать цветовые форматы, размеры и метод получения изображения?

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

Т.е. будет декодировать jpeg'и,

Да.

преобразовывать цветовые форматы,

Да.

размеры

Не помню.

и метод получения изображения?

wtf? Вы про MMAP, USERPTR, чтение из файла?

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

wtf? Вы про MMAP, USERPTR, чтение из файла?

Да, просто, как оказалось, некоторые кривые модули фреймграбберов не все способы поддерживают. А вообще, надо будет попробовать - вдруг и вправду поможет.

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

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

Честно говоря, не помню. Если даже такого нет, то добавить несложно.

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

Действительно, LD_PRELOAD работает (jpeg декодируется «за кулисами» в указанное цветовое пространство). Однако есть и минусы такого способа: IO_METHOD_USERPTR не работает (без LD_PRELOAD работал), IO_METHOD_MMAP формирует слишком огромный буфер, в который складывает подряд чуть ли не 2 секунды видео. В результате возникает сильная задержка. А вообще, конечно, довольно-таки удачный совет, думаю, можно будет найти ему множество применений. Большое спасибо.

P.S. А можно ли как-нибудь внедрить это LD_PRELOAD в код, чтобы не приходилось править глобальные переменные?

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

IO_METHOD_MMAP формирует слишком огромный буфер, в который складывает подряд чуть ли не 2 секунды видео. В результате возникает сильная задержка.

То есть? Первый DQBUF возвращается с двухсекундной задержкой?

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

Нет, у меня кадры захватываются не подряд, а где-то по 4 в секунду. И похоже на то, что буферы обновляются лишь при завершении считывания с последнего буфера. Хотя, может быть, виновата сама веб-камера.

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

Но делать DQBUF/QBUF тебе всё равно надо. V4L2 использует несколько буферов в кольце (сколько сам укажешь, либо сколько драйвер захочет), и когда все буферы заполнены, то видеозахват приостанавливется. Поэтому нужно постоянно читать и возвращать обратно буферы, по-настоящему обрабатывая только те, которые сочтёшь нужными.

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

Да, согласен: лучше завести три потока: один для постоянного обновления буферов, второй для математики и третий для отображения.

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