Веб-камера С# WM_CAP_CONNECT: хотите принудительно использовать источник захвата при наличии нескольких источников захвата

Я использую код WebCam_Capture, который я нашел в Интернете, для доступа через С# к веб-камере. На компьютере с одним видеоисточником это работает как шарм! (Программа запускается при запуске, находит веб-камеру и работает).

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

Итак, у меня есть код веб-камеры, который я действительно нашел здесь:

http://channel9.msdn.com/forums/TechOff/93476-Programmatically-Using-A-Webcam-In-C/?CommentID=94149

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

SendMessage(mCapHwnd, WM_CAP_CONNECT, 0, 0);

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


person Codejoy    schedule 17.05.2010    source источник


Ответы (1)


Единственный намек, который я нашел, это то, что первый 0 — это индекс камеры:

SendMessage(_windowHandle, WM_CAP_CONNECT, _videoSourceIndex, 0)

Попробуйте давать 0,1,2, пока не подключится нужная камера. Обратите внимание, что ответ веб-камеры может занять до 5 секунд. Некоторые из них довольно медленные.

Но лучше всего попробовать библиотеку DirectShow.NET, так как она намного эффективнее, чем API, который вы сейчас используете.

person SlavaGu    schedule 21.05.2010
comment
Спасибо за помощь. Я попытался заменить _videSourceIndex на 1, 2,3, ни один из них не работает, программа мгновенно умирает. Может быть, потому что я пытаюсь использовать графику сразу? Понятия не имею. Я проверил DirectShow.NET, их демонстрация для dxWebCam - это слишком много времени (сервис?). Может быть, я просто не понимаю... - person Codejoy; 22.05.2010
comment
Да, я поиграл с этим еще немного, идея моей программы состоит в том, чтобы ее было очень легко настроить. В ту минуту, когда я ввожу сетевое подключение, его уже не так просто настроить для конечного пользователя IMHO. Я бы обменял необходимость выбора камеры на необходимость настройки службы и подключения к ней. В моей небольшой демонстрации я, наконец, установил службу, запустил ее и попытался подключить к ней клиент, и в этом случае он продолжал говорить об отказе в подключении (и я не являюсь сетевым администратором). Может быть, это просто образец, который слишком сложен для образца. Хотя я ценю помощь. - person Codejoy; 22.05.2010
comment
Мы успешно используем DirectShow.NET, и я согласен, что это довольно сложно. Это потому, что он просто копирует большинство интерфейсов DirectShow. Вы можете попробовать другие бесплатные библиотеки DirectShow. Они не такие мощные, но могут быть достаточными для вашей задачи: Emgu.CV (.NET-порт OpenCV, который, в свою очередь, использует DirectShow для доступа к камерам в Windows)) emgu.com/wiki/index.php/Camera_Capture_in_7_lines_of_code AForge.NET, сам не пробовал, но документация выглядит хорошо, и есть много примеров : aforgenet.com/framework/docs - person SlavaGu; 22.05.2010
comment
СлаваГу ты мужик. Я понял, что использую AForge для движения, но не знал, что у него есть и видео. Хорошее видео вроде, надо будет протестировать. Но он получает строки моникеров всех адаптеров камеры, которые у вас есть. Я могу иметь при установке или первом запуске, чтобы пользователь выбрал, какой из них они хотят использовать, и сохранил это значение где-нибудь (черт возьми, даже в текстовом файле), чтобы использовать это прозвище с тех пор, и если он когда-либо терпит неудачу показать все строки снова и пусть они выберут другое). Это круто СПАСИБО БОЛЬШОЕ! - person Codejoy; 25.05.2010