Работа с Вебкамерой

Модераторы: Duncon, Naeel Maqsudov, Хыиуду, Игорь Акопян

Ответить
VitAngel
Сообщения: 3
Зарегистрирован: 31 мар 2007, 10:37

31 мар 2007, 10:42

Утро доброе! Подскажите как без дополнительных компонент получить снимок с вебкамеры. Нашёл на этом же форуме тот же вопрос http://forum.developing.ru/printthread.php?t=8383, но что то не разобрался в нём. Был у меня похожий код и почему-то программа использовала драйвер не вебкамеры, а тв-тюнера. Если у кого-то есть что-то по этому поводу огромная просьба помочь. Заранее благодарю.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

02 апр 2007, 08:49

Код: Выделить всё

SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
Если в системе несколько устройств захвата, то здесь 3-ий или 4-ый параметр (точно не помню) указывает номер устройства захвата в системе. Т.е. 0 - ТВ тюнер, 1 - Вебкамера, 2 - еще что-то и т.д. Возможно и наоборот: 0 - Вебкамера, 1 - ТВТюнер, но это не суть, так как всегда можно получить имя подключенного устройства.
It's a long way to the top if you wanna rock'n'roll
VitAngel
Сообщения: 3
Зарегистрирован: 31 мар 2007, 10:37

02 апр 2007, 19:42

Прочитав твоё сообщение решил попробовать поменять параметр, указывающий на драйвер. Взял опять тот код. просто решил запустить(ничего не меняя) и бац...всё показывало с вебкамеры, при этом тв было запущено. Потом отключил вебкамеру, включил, а он уже начал ругаться, что типа тв-тюнер уже используется. Я начал пробовать менять параметр, как ты говорил - бесполезно. Условие SendMessage(h_cam, WM_CAP_DRIVER_CONNECT, 0, 0) <> 0 не срабатывает. Вот теперь сижу и ломаю голову: как он в первый раз определил драйвер вебкамеры, а второй раз - тв-тюнер, при том что и там итам оба устройства были подключены??? И ещё хотел спросить: ты там что-то говорил по поводу обращения к устройству по имени. Можешь об этом по подробней.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

04 апр 2007, 09:32

Во-первых для стабильной работы драйвера и приложений по завершении необходимо :
- отсоединять устройство

Код: Выделить всё

SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
- убивать окно драйвера (при закрытии основного или родительского окна необязательно)

Код: Выделить всё

SendMessage(hWndC, WM_DESTROY, 0, 0);
Потому он и ругался, что окно драйвера не убилось (возможно не был указан родитель) и повторное подсоединение к драйверу уже невозможно, а старое окно уже не убьешь, т.к. его Handle где-то затерялся.
Для перечисления устройств можно использовать
- WM_CAP_DRIVER_GET_CAPS
- WM_CAP_DRIVER_GET_NAME
Которые возвращают информацию о имени и параметрах. Т.е. можно подсоединится к драйверу по индексу, получить инфу - отсоединится и т.д. пока SendMessage <> 0.
Еще способ перечисления (enumerate) девайсов API функция, которая позволяет получить описание установленных в системе устройств для захвата видео

capGetDriverDescription(WORD wDriverIndex, LPSTR lpszName, INT cbName, LPSTR Ver, INT cbVer);

- wDriverIndex – индекс драйвера от 0 до 9.
- lpszName – указатель на буфер куда будет помешено имя драйвера устройства.
- cbName – размер буфера для имени драйвера устройства.
- lpszVer – указатель на буфер куда будет помещена версия драйвера устройства.
- cbVer – размер буфера для версии драйвера устройства.

Достаточно перебрать значение индексов от 0 до 9. Если не на один индекс не было положительного результата, значит, в системе нет драйверов устройств, позволяющих осуществлять захват видео.
It's a long way to the top if you wanna rock'n'roll
VitAngel
Сообщения: 3
Зарегистрирован: 31 мар 2007, 10:37

05 апр 2007, 14:18

Пасиба большое
Ответить