Intereting Posts
У лимонного монетного двора есть проблемы с сбоями программ? Как я могу настроить xkb для переключения макетов в обе стороны? Настройка основного монитора в XFCE? Синтаксическая ошибка «elif» неожиданное ожидание fail2ban отлично работает при неудачных попытках SSH, но не работает при неудачных попытках Apache2 Есть ли эквивалент текста (без проклятий) «zenity -question»? Почему клиенты RDP в Linux намного медленнее, чем в Windows? Почему syslog-трафик не отображается в netstat и lsof? ПК с короткоживущей батареей RTC – как сразу синхронизировать время при загрузке и избегать скачков времени Gnome Shell: запуск скрипта оболочки после начала сеанса? Чистый способ вернуть фоновый процесс на передний план в сценарии оболочки mtime – установить формат даты Выходы lsmod: не испорченные Два HTTP-сервера на портах 80 и 443 Каков наилучший способ добавить пользователя в группу sudoer?

Понимание драйверов устройств для веб-камеры Linux

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

В случае веб-камеры USB ответственным драйвером является UVC, который поддерживает любое совместимое с UVC устройство. Это означает, что позволяет ОС или другой компьютерной программе получать доступ к аппаратным функциям без необходимости знать точные сведения об аппаратном обеспечении.

По этой причине я установил драйвер устройства UVC Linux, выполнив:

opkg install kernel-module-uvcvideo 

Веб-камера была распознана ядром Linux: dev/video0 . Тем не менее, я все еще не смог выполнить потоковое видео с помощью FFmpeg, поскольку мне не хватало API V4L2. Я установил V4L2, настроив ядро.

Мои запросы:

  • Как драйвер UVC и V4L2 связаны друг с другом?
  • В чем заключается цель API V4L2?
  • Если я еще не установил UVC, он будет установлен с V4L2?

LinuxTV ссылается: реализация драйвера uvcvideo придерживается только API V4L2 . Это означает, что UVC является частью API V4L2?

Класс USB-видео (UVC) – это спецификация , которой должны соответствовать веб-камеры USB и т. Д. Таким образом, они могут использоваться в любой системе, которая реализует поддержку устройств, совместимых с UVC.

V4L2 – это подсистема видео ядра Linux, от которой зависит реализация linux UVC. Другими словами, в ядре поддержка UVC требует V4L2, но не наоборот.

API V4L2 относится к интерфейсу программирования пользовательского пространства , описанному здесь .

Удивительно, сколько документации вы можете найти для Video4Linux2 – и ничто из этого на самом деле не объясняет, что такое Video4Linux.

Во-первых, Video4Linux2 является базой драйверов Linux. Рамочные драйверы фактически не управляют устройствами напрямую. Вместо этого они предоставляют абстрактную модель некоторого класса устройств, в данном случае – видеоустройства для приложений. Основы драйверов обеспечивают три основных преимущества:

  1. Обеспечьте единый API для приложений, которые будут использоваться с очень широким спектром физических устройств, независимо от того, подключены ли они через USB, PCIe, MIPI, Ethernet или другой тип транспортной шины данных
  2. В ядре фреймворки содержат тип кода, который необходим почти во всех драйверах устройств определенного класса, что значительно уменьшает объем разрозненного кода
  3. В ядре фреймворки обеспечивают план для написания новых драйверов нижнего уровня, которые фактически контролируют аппаратное обеспечение, что упрощает разработку драйверов.

Таким образом, драйвер V4L2 является драйвером высокого уровня, который управляет драйвером UVC, который управляет драйвером USB, который может управлять еще более низким уровнем аппаратного драйвера.

Эта модель Matryoshka очень распространена в дереве драйверов ядра Linux. V4L2 является одним из наиболее сложных примеров, потому что некоторым устройствам камеры требуется доступ к большим группам под-устройств в нескольких слоях, которые управляют камерой и направляют вывод камеры среди различных компонентов, таких как процессоры изображений.

Вы все равно можете получить доступ к драйверу UVC непосредственно из пользовательского пространства, используя файл устройства и системные вызовы ioctl, не проходя через драйвер V4L2, и вы все равно можете получить доступ к базовому драйверу USB непосредственно из пользовательского пространства, используя его файл устройства и «ioctl».

Будучи общей структурой, обеспечивающей функциональность, присущую широкому спектру устройств, V4L2 не предоставляет вам всех функций, которые может обеспечить драйвер UVC (при условии, что ваше устройство фактически обеспечивает больше функций UVC, чем требуется для поддержки V4L2) ,

Поэтому, если у вас должно быть устройство UVC, которое предоставляет все функции, указанные в спецификации UVC, то для фактического использования некоторых из этих функций вам нужно будет получить доступ к драйверу UVC непосредственно через файл устройства и систему «ioctl» при условии, что драйвер UVC ядра Linux фактически поддерживает всю спецификацию UVC.

Однако значение

Реализация драйвера uvcvideo придерживается только API V4L2

заключается в том, что в текущем Linux-драйвере UVC-драйвер фактически не обеспечивает больше поддержки функций UVC, чем требуется для V4L2.

Поддержка V4L2 в ядре сама по себе не обеспечивает поддержку UVC или USB или поддержку аппаратного обеспечения USB более низкого уровня.