Как программно сбросить устройство USB-камеры в Python или скрипт Shell на MacOS? - PullRequest
0 голосов
/ 11 января 2020

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

Моя конфигурация:

  • У меня есть устройство с 24 камерами, состоящее из 24 USB-камер и пары USB-концентраторов, подключенных к моему MacBook Pro, на котором установлена ​​Catalina.

  • Я написал python программа, которая вызывает оболочки для imagesnap -list, чтобы получить список всех USB-камер, подключенных к моей Ma c.

  • Я отказываюсь от встроенной камеры FaceTime из полученного списка, и список оставшихся камер - это 24 из моего устройства массива изображений.

  • Моя python программа затем перебирает все камеры в списке и вызывает вызовы оболочки imagesnap -d, чтобы получить изображение с каждой камеры, а затем сохраняет изображение в формате JPG.

  • Мое устройство массива камер предназначено для использования несколько раз подряд без прерывания работы программы или перезагрузка Ma c.

Моя проблема:

  • Эта программа правильно захватывает 24 изображения из 24 камеры большую часть времени.

  • Но время от времени команда imagesnap -d будет зависать в ожидании ввода-вывода с камеры.

  • Когда Я говорю, что он зависает, я имею в виду, что он не возвращается и не говорит об ошибке, и при этом он не указывает ошибочно, что изображение было получено, он просто продолжает ждать, пока изображение поступит от устройства вечно, пока я не CNTL- C или установить время ожидания вызова оболочки.

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

  • Перезагрузка универсально устраняет эту проблему. Но со временем все больше и больше камер будут испытывать эту проблему, пока они снова не будут сброшены.

Решение, на которое я надеюсь:

  • Я надеюсь, что есть какой-то код python или команда оболочки, которую я могу выполнить для сброса speci c USB-устройства (или в моем случае сбросить спецификацию c USB-устройство камеры) .

  • (Примечание: я обнаружил, что python может сделать ioctl () и fcntl () обращаются к устройству, но я не смог найти никаких советов о том, как использовать их для сброса USB или указать устройство камеры.)

  • В качестве альтернативы, возможно, есть способ сбросить спецификации c физический USB-порт , к которому подключен массив, или путь к Сбросьте всю шину USB.

В своем исследовании я натолкнулся на ряд решений, которые не являются программируемыми c, поэтому можно не быть частью моего автоматическое обнаружение и исправление этих замороженных портов. Другие - это какой-то вариант обычной перезагрузки компьютера, сброса SM C или сброса некоторой памяти путем перезагрузки, когда «удерживаются клавиши« Command-Option-PR »вместе». Очевидно, что такие решения не позволяют мне программно вызывать их перезагрузить устройство и продолжить работу с программой, чтобы они мне не нужны.

...