1

Мне нравится устанавливать три веб-камеры на компьютере с Windows 10, чтобы разрешить одновременный захват видео со всех трех из них. Все три камеры USB2.0 подключены к концентратору USB3.0 с питанием, который подключен к ПК. Камеры будут использоваться в режиме низкого разрешения с низким FPS, поэтому пропускная способность USB3.0 (и даже пропускной способности USB2.0) будет достаточной для всех трех потоков с низким разрешением и низким FPS. ,

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

Мне удалось настроить три камеры с использованием трех отдельных контроллеров USB (одна встроена в мой ноутбук, а две - в док-станцию, одна из них - USB2.0, а другая - в порт USB3.0), поэтому проблема явно связана с подключением их к одному контроллеру с использованием концентратора.

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

Мы попробовали версию этой установки для Linux и смогли заставить ее работать, используя один из «причуд» режимов драйвера uvcvideo Linux, который называется UVC_QUIRK_FIX_BANDWIDTH:

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

Поскольку у драйвера uvcvideo нет возможности узнать, какую полосу пропускания потребует устройство, устройства отвечают за то, чтобы максимально точно сообщать драйверу о необходимой полосе пропускания. Каждая альтернативная настройка интерфейса потоковой передачи видео соответствует одному возможному значению полосы пропускания для связанной конечной точки, и драйвер затем выбирает альтернативную настройку с наименьшей полосой пропускания, большей или равной полосе пропускания, запрошенной устройством.

Хотя большинство устройств реализуют несколько альтернативных настроек и запрашивают только ту полосу пропускания, которая им действительно необходима, некоторые просто всегда запрашивают максимальную полосу пропускания, доступную для одной конечной точки, равную 198.608 Мбит / с, исключая издержки протокола. Вдвое эта пропускная способность превысит ограничение высокоскоростного USB, что приведет к ошибкам -27 (-ENOSPC).

Если устройство реализует несколько альтернативных настроек, драйвер может игнорировать запрошенную полосу пропускания и выбрать альтернативную настройку с меньшей полосой пропускания. Это поведение в настоящее время реализуется через причуду FIX_BANDWIDTH при использовании несжатого формата. Сжатые форматы труднее обойти, так как драйвер не может оценить, какая полоса пропускания может реально потребоваться устройству.

Причуда FIX_BANDWIDTH может быть безопасно включена без риска какого-либо негативного влияния на стабильность системы, поскольку она влияет только на устройства UVC. В редких случаях это может теоретически недооценивать требуемую пропускную способность USB, что приводит к потере пакетов USB и повреждению изображений. На сегодняшний день о таких случаях на практике не сообщалось.

Вы можете узнать, какую полосу пропускания запрашивает устройство и какую альтернативную настройку выбирает драйвер, установив для параметра трассировки модуля uvcvideo значение 0x400. Драйвер выведет информацию о пропускной способности в журнал ядра.

Подробнее об этом здесь: http://www.ideasonboard.org/uvc/faq/

Итак, я хотел бы сделать что-то подобное в Windows, чтобы драйвер UVC игнорировал пропускную способность, сообщаемую камерами, поскольку фактическая пропускная способность будет намного ниже, чем заявленная.

Есть ли способ, которым я могу это сделать? Как использовать некоторые альтернативные драйверы или модифицировать текущие, чтобы разрешить эту «причуду»?

0