Как получить список видеоустройств с определенным VendorID и / или ProductID с помощью FFmpeg (в Ma c OS) - PullRequest
0 голосов
/ 26 мая 2020

Основная задача:

Я пишу программное обеспечение для множества 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.

...