Работа с Вебкамерой
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Утро доброе! Подскажите как без дополнительных компонент получить снимок с вебкамеры. Нашёл на этом же форуме тот же вопрос http://forum.developing.ru/printthread.php?t=8383, но что то не разобрался в нём. Был у меня похожий код и почему-то программа использовала драйвер не вебкамеры, а тв-тюнера. Если у кого-то есть что-то по этому поводу огромная просьба помочь. Заранее благодарю.
Код: Выделить всё
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
It's a long way to the top if you wanna rock'n'roll
Прочитав твоё сообщение решил попробовать поменять параметр, указывающий на драйвер. Взял опять тот код. просто решил запустить(ничего не меняя) и бац...всё показывало с вебкамеры, при этом тв было запущено. Потом отключил вебкамеру, включил, а он уже начал ругаться, что типа тв-тюнер уже используется. Я начал пробовать менять параметр, как ты говорил - бесполезно. Условие SendMessage(h_cam, WM_CAP_DRIVER_CONNECT, 0, 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. Если не на один индекс не было положительного результата, значит, в системе нет драйверов устройств, позволяющих осуществлять захват видео.
- отсоединять устройство
Код: Выделить всё
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
Код: Выделить всё
SendMessage(hWndC, WM_DESTROY, 0, 0);
Для перечисления устройств можно использовать
- 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