Web camera driver linux

Устанавливаем веб-камеру в Linux

Оригинал: Configuring your webcam to work under Linux
Автор: Bruce Byfield
Дата: 6 сентября 2007
Перевод: Александр Тарасов aka oioki
Дата перевода: 11 сентября 2007

Если вы хотите испытать ощущения пользователя ранних версий GNU/Linux, попробуйте настроить веб-камеру на своей системе. В отличие от большинства устройств, веб-камеры зачастую не устанавливаются автоматически. Более того, если вы устанавливаете принтер, то вы знаете, что искать решение нужно в пакете Common Unix Printing System ( CUPS ) и его интерфейсах. С веб-камерами дело иначе — успех вашей затеи зависит лишь от того, что вы найдете в интернете, и от ваших знаний модулей ядра и драйверов. Эти обстоятельства приводят к тому, что настройка веб-камеры звучит как вызов — однако если отнестись к делу с пониманием того, что вы делаете, достаточной степенью осторожности и, может быть, долей удачи, возможно установить веб-камеру менее чем за вечер.

Если ваша веб-камера внешняя, это будет наилучшей предпосылкой для ее успешной настройки. Существует множество сайтов для различных производителей и моделей, поиск вам в помощь. В большинстве случаев вы не найдете исчерпывающую информацию на сайте производителя. Вместо этого лучше идите на неофициальные сайты — они заполняются самими пользователями, поэтому содержат наиболее достоверные сведения и комментарии. Webcam HOWTO , составленный Говардом Шейном (Howard Shane), хотя и устарел на пару лет, но содержит несколько полезных ссылок. Если камера подключается по FireWire, попробуйте список цифровых камер IEEE1394 , поддерживаемый Дэмьеном Душампсом (Damien Douxchamps).

Особенно полезен сайт A Free World Мишеля Ксаарда (Michel Xhaard), чьи драйвера Spca5xx уже нашли путь к репозиториям основных дистрибутивов, включая Debian. Если ваша веб-камера есть в списке, а пакет драйверов в репозитории вашего дистрибутива, тогда ваши шансы велики, и камера может быть определена автоматически при установке пакета.

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

Много информации о камере можно почерпнуть прямо с компьютера. Для этого есть несколько способов:

  • Протестируйте камеру с помощью подходящей программы (см. ниже). Если заработает, тогда ваша камера напрямую поддерживается ядром. Этот случай редок на сегодняшний день.
  • Используйте команду dmesg | more , чтобы узнать определена ли веб-камера при загрузке системы. Найдя упоминание о ней, попробуйте найти созвучный модуль ядра (опять же, можно попробовать угадать) в каталоге /lib/modules/ , конкретно в подкаталоге /usb , который зарыт в глубине файловой системы. Точное расположение подкаталога /usb зависит от дистрибутива. В Debian полный путь /lib/modules/kernel/build/drivers/usb , а в Fedora 7 — /lib/modules/kernel/kernel/drivers/usb .
  • На сегодняшний день наиболее распространены USB-камеры. Для просмотра подключенных USB-устройств используйте консольную программу lsusb , либо графическую v4l2-tool (поищите ее в своем репозитории). Найдите камеру по ее имени (или попробуйте найти ее методом исключения, или вообще угадать) и запишите ей соответствующий 8-значный код (с двоеточием посередине) в последней колонке списка. Этот код определяет производителя и идентификатор продукта, который можно использовать при поиске драйвера в интернете. В программе v4l2-tool ввод этого идентификатора во вкладке Suggest Driver даже может дать вам название нужного драйвера. Вооружившись этой информацией, отправляйтесь в интернет за драйвером. Если найдете, загружайте и компилируйте его. В некоторых случаях вам придется сперва загрузить кое-какие зависимости. К примеру, драйвер для камеры Ricoh R5U870 требует наличия пакета поддержки динамических модулей ядра (Dynamic Kernel Module Support, DKMS).
Читайте также:  Как обновить windows home edition

В случае упомянутой Ricoh R5U870 включение DKMS означает, что драйвер может быть автоматически установлен, как только будет скомпилирован. Возможно, потребуется устанавливать драйвер как заплатку (patch) к ядру, хотя это больше относится к старым камерам. В большинстве случаев, если у вас получится скомпилировать драйвер, установить его (загрузить модуль ядра) можно будет командой modprobe имя_драйвера . Если вы найдете удачную конфигурацию и будете удовлетворены работой камеры, закрепите свой выбор добавлением имени драйвера в скрипт /etc/modules или строки modprobe имя_драйвера в /etc/rc.d/rc.local . Тогда ваш драйвер будет загружаться при запуске системы.

Тестирование

Если вы дошли досюда, значит, все самое сложное позади, но вас еще могут подстерегать некоторые трудности. В зависимости от дистрибутива, вам может потребоваться создать с помощью команды addgroup новую группу пользователей video и поместить свои учетные записи в нее, чтобы все пользователи смогли пользоваться веб-камерой. Вдобавок нужно проверить работу камеры с помощью нескольких программ, таких как CamStream , Ekiga и Kopete — некоторые могут не работать с вашей камерой. Попробуйте обновить эти программы, иногда это может решить проблему.

Если для установки драйвера веб-камеры вы использовали DKSM, то после установки проверьте, что все остальное у вас работает (к примеру, у меня перестала работать беспроводная сетевая карта, включенная с помощью Ndiswrapper ). Эта проблема может остаться «висеть» даже при перезагрузке, однако при выключении компьютера и повторном включении проблема исчезает. Если же и это не помогло, попробуйте удалить остановившееся устройство и установить его заново.

Заключение

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

Производители веб-камер, как и производители других устройств, совершенно не заинтересованы в выпуске драйверов для GNU/Linux. Таким образом, подавляющее большинство драйверов веб-камер для GNU/Linux — результат обратной разработки драйверов разработчиками-энтузиастами, многие из которых никогда не задумывались о стандартизации результатов своей работы.

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

Источник

Захват видео с 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.

Читайте также:  Shared memory linux python

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

Uvc2http

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

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

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

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

Результаты

Ниже табличка с результатами сравнения 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 или полный образ (обязательно если вам необходим патч драйвера) для вашей целевой платформы. Если установить утилиту как пакет, то она будет запускаться при старте.
  • Установить пакет на устройство/обновить систему
  • Читайте также:  Kyocera m2135dn драйвер windows 10 x64

    Что дальше

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

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

    Источник

    Работа с 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, виодеформаты изображения, настройка камеры, вывод изображения в текстуру, работа с несколькими камерами.

    Источник

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