Эмулятор веб камеры linux

Работа с usb видеокамерой в Linux. Часть 1

По популярности видеокамера, сегодня, стоит в одном ряду с микрофоном и наушниками. Она используется в различных направлениях, таких как распознавание объектов, дополненная реальность, видеоконференции и множество других. Но что же скрыто под капотом этих сложнейших программ? Как мы получаем картинку с видеокамеры? Этот цикл статей позволит взглянуть на простоту работы с видеокамерой на низком уровне, обработку полученного изображения.

Для начала, немного информации о работе с устройствами в системе Linux. Устройства в nix системах представляют собой файл. С некоторыми файлами-устройств мы можем работать как с обычными файлами. Например:

эта команда выведет на экран весь диск sda.

Есть устройства с которыми нельзя работать напрямую, к ним относится видеокамера.При попытке это сделать мы получим такую реакцию системы:

*Где /dev/video0 это файл-устройство найшей видеокамеры.

Для работы с ней нам понадобится системная функция ioctl детальнее о ней можно ознакомится [1]. Попробуем это применить. Вот код позволяющий считать информации с устройства (альтернатива команде cat для видеоустройств):

В первых строках кода считываются параметры с которой запущено приложение. Если параметров нету то device_name принимает стандартоне значение «/dev/video0».

В блоке «Open Device» происходит открытие устройства системной функцией open (нужно подключить header fcntl.h). Обязательный параметр O_RDWR отвечает за открытие устройства считывания/записи. Если при подключении возникла ошибка, то функция open вернет -1.

Блок «Read Params From Device» — это сердце нашей маленькой программы. Для его использования надо подключить билиотеку возможно прийдется её установить, у каждого дистрибутива свой пакет под эту библиотеку
Системная функция ioctl имеет три параметра:
file_device — дескриптор нашего устройства
VIDIOC_QUERYCAP — функция ядра, которую применяем для нашего устройства.
device_params — область памяти куда будет сброшен результат функции «VIDIOC_QUERYCAP».

device_params это структура состоящая из таких полей:

если возникла ошибка ioctl вернет -1

Блок «Close Device» закрывает дескриптор устройства.

Посмотрим программу в действии.

устройство не определилось ядром либо не подключено уборщица опять ненужные провода дергала.
Подключаем и заново запуск. Получаем такую информацию:

поле capabilities и device capabilities можно расшифровать благодаря константам из файла videodev2.h:

На этом вводная статья заканчивается. В следующих обзорах будут затронуты, такие темы как memory-mapping, виодеформаты изображения, настройка камеры, вывод изображения в текстуру, работа с несколькими камерами.

Источник

Виртуальная камера в QEMU / Android

Виртуалка qemu, клиент — android-x86. Usb-камеры нет в наличии.

Хочу заставить ватcaп принимать входящие видеозвонки, но он отказывается если локальная видеокамера не доступна.

Как можно эмулировать камеру в android-е, или пробросить ему /dev/video0 с хоста?

Как его установить в android-е? Или пробросить с хоста как-то можно? Консоль с правами администратора там есть.

Usb-камеры нет от слова совсем.

это обычный ядерный модуль, собери для своего адроид ядра.

я правда не знаю есть ли тонкости в android с v4l2 устройствами.

Эмулятор, встроенный в Android Studio умеет эмулировать камеру (какя-то анимация воспроизводится). Эмулятор можно запустить отдельно от студии, он на основе qemu.

Погуглив понял, что это реально. Но если даже соберу модуль и загружу, то, как с /dev/video0 работать начать, хотя-бы картинку туда запихать имеющимися в android утилитами? Не придётся ли ещё и ffmpeg компилировать?

Читайте также:  Windows console type command

Ну-ну, а на какой у тебя шине источник картинки, которую ты пробрасывать собрался?

Ни на какой. Вопрос в том как создать виртуальную камеру. И лучше со смешной картинкой.

Не получается установить скаченный apk в эмулятор, висит окошко «Installing APK. » и всё
https://img15.lostpic.net/2020/02/03/534bed1cc9058056c3b5c23cc6098910.png

Сделай из командной строки, через adb. По крайней мере есть шанс увидеть выхлоп.

На Pixel 3a android 10 встал через маркет.

Для маркета нужен аккаунт Google, а он не создаётся.
Google не нравится номер телефона, пишет «Этот номер нельзя использовать для подтверждения ID». Пробывал несколько номеров, на которые точно ничего раньше не регистрировалось. Все номера от полосатой ОПГ, но это временно.

Хотел купить usb-камеру на днях, будете смеяться — не хватило 300р.

Не знаю как.
Но вот выхлопы (кое-что видно):

Источник

Превращаем обычную веб-камеру в камеру слежения, работающую в Ubuntu Linux

Хотите ли вы превратить свою обычную веб-камеру в камеру слежения? Хотите ли вы автоматически загружать отснятые изображения или видео с вашей веб-камеры на удаленный сервер? Вы хотите знать, кто крадет ваших кур? Если вы ответили «да» хотя бы на один из перечисленных вопросов, то вам следует прочитать данную статью.

Но сначала вам потребуются: компьютер с установленной системой Linux, веб-камера, работа с которой поддерживается системой, и несколько бесплатных и отрытых пакетов программного обеспечения, о которых мы расскажем ниже.

Давайте пройдем через весь процесс установки в Ubuntu вашей собственной домашней камеры слежения. Учтите, что это можно также сделать и на других дистрибутивах Linux. Но прежде, чем двигаться дальше, я предполагаю, что для вашей веб-камеры есть подходящий драйвер и что веб-камера полностью работоспособна.

Теперь можно идти дальше:

Шаг 1: Устанавливаем программу — детектор движения, которая соответственно называется » Motion «.

Вы можете установить эту программу с помощью графического менеджера пакетов Synaptic Package Manager, либо в окне терминала с помощью следующей команды:

Шаг 2: После завершения установки вы фактически превращаете свою обычную веб-камеру в камеру слежения. Единственное, что вам нужно теперь сделать для того, чтобы запустить процесс отслеживания движения и сохранять полученные изображения, это выполнить в терминальном окне следующую команду:

Происходит сохранение полученных изображений .

Вы можете остановить процесс отслеживания движения с помощью нажатия клавиш CTRL+C.

По умолчанию изображения сохраняются в директории «/tmp/motion», при этом отмечается время, когда произошел захват изображения. Однако, вы можете сконфигурировать и изменить настройки, используемые по умолчанию, если перейдете в директорий «/etc/motion» и отредактируете файл «motion.conf». Если вы захотите изменить директорию, где хранятся полученные изображения, просто найдите и измените строку «target_dir /tmp/motion».

Для ознакомления с параметрами настройки конфигурационного файла приложения “Motion” перейдите по следующей ссылке .

Шаг 3: На самом деле мы можем остановиться на «Шаге 2», поскольку у нас уже имеется камера, которую можно использовать для отслеживания движения. Но для тех продвинутых пользователей, которые ищут интересные решения, это может показаться скучным. Так что давайте продолжим и настроим приложение «Motion» так, чтобы оно посылало отснятые изображения на удаленный сервер FTP и сохраняло их там.

Сначала давайте установим «wput», клиентскую программу FTP, работающую из командной строки:

После этого с помощью подходящего редактора отредактируем файл “motion.conf” — в конце файла добавим следующую строку:

Если вы хотите, чтобы приложение Motion запускалось автоматически, просто добавьте его в группу запускаемых программ «Startup Programs».

Читайте также:  Gigabyte fsb1066 ga 945gcmx s2 драйвера windows хр

Шаг 4: Теперь вы можете открыть веб-интерфейс программы Motion, набрав для этого в веб-браузере сервера адрес localhost:8000 или на удаленном компьютере — XXX.XXX.X.XXX:8000. Если вы хотите видеть видеопоток в реальном времени, то наберите в веб-браузере на сервере адрес localhost:8001, а на удаленном компютере — XXX.XXX.X.XXX:8001.

Позвольте мне еще сообщить вам, что можно подключить и использовать сразу несколько веб-камер. Инструкции по настройке можно найти по следующей ссылке .

Это все. Наслаждайтесь работой вашей новой камерой слежения. Теперь ваша задача — установить веб-камеру в нужном месте и, возможно, замаскировать ее.

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

Источник

Захват видео с USB камер на устройствах под управлением Linux

Предыстория

  1. Видео в разрешении FullHD (1920Х1080) или HD (1280х720) и нормальная частота кадров (чтобы можно было играть).
  2. Игрушку я планировал отдать детям, поэтому нужен был автостарт и поддержка подключения/отключения камеры.

В общем хотелось что-то вроде этого:

Ограничения

Я не собирался искать решение, которое работает всегда и везде. Следующие ограничения меня вполне устраивали:

  1. Хороший WiFi сигнал.
  2. Ограниченное число подключений, приоритет отдавался случаю, когда есть всего один клиент.
  3. Камера поддерживает режим MJPG.

HW и SW

Предварительный анализ

Код UVC драйвера оказался готов к добавлению различного рода “специальных” решений, и я легко нашел место, где надо скорректировать размер буфера (функция uvc_fixup_video_ctrl()). Более того, драйвер поддерживает набор quirks, которые позволяют поддерживать камеры с разного рода отклонениями от стандарта UVC. В общем, разработчики драйвера сделали лучшее, что возможно для поддержки зоопарка камер.

Добавив коррекцию размера буфера, я получил стабильную работу в режиме 1280х720 и даже в режиме 1920х1080. Ура! Половина задачи решена!

В поисках новых приключений

Немного порадовавшись первой удаче, я вспомнил, что mjpg-streamer далек от совершенства. Наверняка можно сделать что-то простое, не такое универсальное как mjpg-streamer, но более подходящее для моих условий. Так я решил сделать uvc2http.

В mjpg-streamer мне не понравилось использование нескольких потоков и копирование буферов. Это определило архитектуру решения: 1 поток и никакого копирования. Используя non-blocking IO, это делается достаточно просто: захватываем кадр и без копирования отсылаем его клиенту. Есть небольшая проблема: пока мы отсылаем данные из буфера, мы не можем вернуть буфер обратно в очередь. А пока буфер не в очереди, драйвер не может положить в него новый кадр. Но если размер очереди > 1, то это становится возможным. Число буферов определяет максимальное количество подключений, которое можно гарантированно обслуживать. Т.е., если я хочу гарантированно поддерживать 1 клиента, то 3-х буферов достаточно (в один буфер пишет драйвер, из второго отсылаем данные, третий в запасе, чтобы избежать конкуренции с драйвером за буфер при попытке получить новый кадр).

Uvc2http

Uvc2http состоит из двух компонентов: UvcGrabber и HttpStreamer. Первый отвечает за получение буферов (кадров) из очереди и возврат их обратно в очередь. Второй отвечает за обслуживание клиентов по HTTP. Есть еще немного кода, который связывает эти компоненты. Подробности можно посмотреть в исходниках.

Неожиданная проблема

Все было замечательно: приложение работало и в разрешении 1280х720 выдавало 20+ кадров/сек. Я делал косметические изменения в коде. После очередной порции изменений я замерил частоту кадров. Результат был удручающий — меньше 15 кадров. Я бросился искать, что же привело к деградации. Я потратил, наверное, 2 часа в течение которых частота уменьшалась с каждым замером до значения 7 кадров/сек. В голову лезли разные мысли о деградации из-за долгой работы роутера, из-за его перегрева. Это было что-то непонятное. В какой-то момент я отключил стримминг и увидел, что просто один захват (без стримминга) давал те же 7 кадров. Я даже начал подозревать проблемы с камерой. В общем какая-то чушь. Дело было вечером и камера, повернутая в окно, показывала что-то серое. Дабы сменить мрачное изображение я повернул камеру внутрь комнаты. И, о чудо! Частота кадров увеличилась до 15 и я все понял. Камера автоматически подстраивала время экспозиции и в какой-то момент это время стало больше длительности кадра при заданной частоте. За эти два часа случилось следующее: сначала плавно темнело (это был вечер), а потом я повернул камеру внутрь освещенной комнаты. Направив камеру на люстру я получил 20+ кадров/сек. Ура.

Читайте также:  Windows powershell and cmd

Другие проблемы и нюансы использования

Результаты

Ниже табличка с результатами сравнения mjpg-streamer и uvc2http. Если коротко — есть значительный выигрыш в потреблении памяти и небольшой выигрыш в частоте кадров и загрузке CPU.

1280×720 1920×1080
VSZ, KB, 1 client VSZ, KB, 2 clients CPU, %, 1 client CPU, %, 2 clients FPS, f/s, 1 client FPS, f/s, 2 clients VSZ, KB, 1 client VSZ, KB, 2 clients CPU, %, 1 client CPU, %, 2 clients FPS, f/s, 1 client FPS, f/s, 2 clients
Mjpg-streamer 16860 19040 26 43 17.6 15 25456 25812 28 50 13.8 10
uvc2http 3960 3960 26 43 22 19.6 7576 7576 28 43 15.5 12.2

Ну и конечно же видео, которое я сделал вместе с детьми:

Фото получившегося танка (получилось что-то вроде цыганской телеги):

Использование

Исходники находятся здесь. Для использования на PC Linux надо всего лишь собрать (при условии что вы не хотите патчить драйвер UVC). Утилита собирается с помощью CMake стандартным способом. Если же надо использовать в OpenWRT, то надо сделать дополнительные шаги:

  1. Скопировать содержимое директории OpenWrt-15.05 в корень репозитория OpenWRT. Эти файлы только для OpenWRT 15.05. Они описывают новый пакет для OpenWRT и патч для драйвера UVC.
  2. Если ваша камера также возвращает завышенный размер необходимого буфера, то надо добавить использование quirk UVC_QUIRK_COMPRESSION_RATE для вашей камеры в файле uvc_driver.c. Для этого надо сделать собственный патч для драйвера UVC. Как это сделать, описано здесь wiki.openwrt.org/doc/devel/patches. Вам необходимо добавить описание вашей камеры в массив uvc_ids. В качестве примера можно посмотреть на описание моей камеры:
  • Настроить сборку OpenWRT стандартный методом (http://wiki.openwrt.org/doc/howto/build). При настройке необходимо выбрать пакет uvc2http в меню Multimedia.
  • Собрать пакет uvc2http или полный образ (обязательно если вам необходим патч драйвера) для вашей целевой платформы. Если установить утилиту как пакет, то она будет запускаться при старте.
  • Установить пакет на устройство/обновить систему
  • Что дальше

    Решение состоит из двух частей: патч драйвера и другой алгоритм стримминга. Патч драйвера можно было бы включить в новую версию ядра линукса, но это спорное решение, так как оно основано на предположении о минимальном коэффициенте сжатия. Утилита же, на мой взгляд, хорошо подходит для использования на слабых системах (игрушках, домашних системах видеонаблюдения), и ее можно немного улучшить, добавив возможность задавать настройки камеры через параметры.

    Алгоритм стримминга можно улучшить так как есть запас по загрузке CPU и по ширине канала (я легко получал с роутера 50+ MBit подключая десяток клиентов). Также можно добавить поддержку звука.

    Источник

    Оцените статью