Основная задача:
Я пишу программное обеспечение для множества USB-камер. Камера может быть подключена к процессору, в котором есть другие встроенные или подключенные USB-камеры. Мне нужно захватить одно изображение 1920x1080 JPG с КАЖДОЙ из камер МОЕГО массива в каталог изображений, но мне нужно ИСКЛЮЧИТЬ любые ДРУГИЕ камеры при съемке.
Прямо сейчас я пытаюсь реализовать для MacOS, но в будущем я буду реализовывать для Windows, Linux, iOS и Android.
Что известно :
Я знаю VendorID, ProductID и UniqueID (сообщается в отчете об оборудовании системы USB MacOS) для каждой камеры в массиве камер.
UNIQUESKY_CAR_CAMERA #5:
Model ID: UVC Camera VendorID_7119 ProductID_2825
Unique ID: 0x143400001bcf0b09
UNIQUESKY_CAR_CAMERA #6:
Model ID: UVC Camera VendorID_7119 ProductID_2825
Unique ID: 0x143300001bcf0b09
Код проблемы:
Я сделал следующий вызов FFmpeg
ffmpeg -nostdin -hide_banner -an -sn -dn -f avfoundation -list_devices true -I 1
Я получил следующий результат в stderr :
[AVFoundation indev @ 0x7fc870e21800] AVFoundation video devices:
[AVFoundation indev @ 0x7fc870e21800] [0] FaceTime HD Camera (Built-in)
[AVFoundation indev @ 0x7fc870e21800] [1] UNIQUESKY_CAR_CAMERA #5
[AVFoundation indev @ 0x7fc870e21800] [2] UNIQUESKY_CAR_CAMERA #6
[AVFoundation indev @ 0x7fc870e21800] [3] Capture screen 0
[AVFoundation indev @ 0x7fc870e21800] [4] Capture screen 1
[AVFoundation indev @ 0x7fc870e21800] AVFoundation audio devices:
[AVFoundation indev @ 0x7fc870e21800] [0] MacBook Pro Microphone
1: Input/output error
Из этих устройств, перечисленных в вывода, я знаю (в этом конкретном ТЕСТОВОМ СЛУЧАЕ), что камеры в моем тестовом массиве - это только эти две:
[1] UNIQUESKY_CAR_CAMERA #5
[2] UNIQUESKY_CAR_CAMERA #6
Обладая этим знанием, я могу выбрать индексы (1 2), которые я необходимо, а затем используйте следующий код для захвата изображения с каждого:
for i in 1 2;
do
ffmpeg -y -hide_banner -f avfoundation -r 15 -video_size 1920x1080 -i 1 -f image2 -qscale:v 1 -qmin 1 -qmax 1 -frames:v 1 img$i.jpg;
done
К сожалению, в производственном использовании (то есть вне этого тестового примера) я НЕ МОГУ полагаться на камеры все идентифицируют себя с помощью префикса «имя» того же ТЕКСТА ( например, «UN IQUESKY_CAR_CAMERA "), поэтому я не могу просто использовать grep для выбора тех, которые мне нужны.
Но я CAN должен быть уверен, что я буду знать их VendorID, ProductID и UniqueID.
Итак, IF I мог бы получить
ffmpeg -nostdin -hide_banner -an -sn -dn -f avfoundation -list_devices true -I 1
, чтобы также указать VendorID и ProductID, тогда я мог бы найти эти значения с помощью grep.
Возможно ли это решение? Я могу ' t найдите синтаксис в документации или примеры того, как установить такие ограничения.
АЛЬТЕРНАТИВНО: если бы я мог указать FFmpeg -list_devices до ограничить список вывода только теми, у кого указаны мои идентификаторы VendorID и ProductID, тогда я могу легко получить список индексов устройств, которые мне понадобятся для последующего извлечения изображений.
Это решение возможно? Я не могу найти синтаксис в документации или примеры того, как установить такие ограничения.
Специальное примечание:
Я использую камеры все 1920x1080, и это разрешение необходимо для моего приложения. Как было отмечено многими пользователями Ma c в Интернете, другие программы захвата изображений (например, imagesnap ) иногда захватывают изображения с более низким разрешением (1024x720), чем способны камеры, и не могут захватывать изображения с более высоким разрешением, например (1920x1080). По этой причине и поскольку он доступен на ВСЕХ интересующих нас платформах ОС, я решил использовать FFmpeg.