Домашняя страничка Стефурак П.Б. Простая web камера.
 
     Домашняя Промзона Спальный район  

Промзона \ Простая web камера.
Простая web камера, не требовательная к ресурсам

  Есть у меня дома выделенная линия интернет, старенький компьютер (PIII 850мГц) и USB камера - почему бы не сделать web камеру!
Проблема в том, что имеющееся в изобилии ПО для web трансляции картинки с USB камеры требовательно к ресурсам.
В частности, все мною испробованное или не работает, или грузит машинку на 100%, так что даже курсор мыши не сдвинуть, или "глючит", по этому решил написать свое простое ПО для этого дела.

В итоге родилось следующее решение:
  • специальной программой картинка из USB камеры пишется в файл по определенному алгоритму: если есть движение в кадре, то каждые 20сек, если нет, то каждую минуту.
  • полученные картинки помещаются в каталог, доступный web серверу, в моем случае IIS.
  • при обращении к адресу модуля сервера, за картинкой, модуль ищет в каталоге последнюю сохраненную картинку и отдает ее пользователю по стандартному HTTP протоколу.
  • выполняется много других необходимых действий, таких как очистка каталога от старых файлов, перезапуск сервера IIS, и т.д.
  • программа стартует и выгружается по расписанию, при запуске запускает web сервер, при выгрузке останавливает web сервер.
  • программа начинает работать, как только выбрано устройство и размеры картинки, но автоматически эти настройки не запоминает (Use Save!).

    Внешний вид окна программы получения изображения из USB камеры (Re_host):
    Часть настроек программы выполняется из главного окна (см. выше), часть - в INI файле программы:
    VideoDevice= - выбранное устройство
    VideoSize= - выбранные размеры изображения
    VideoRender=6 - если 0 - то предпросмотр включен, если 6, то выключен - отключение предпросмотра существенно разгружает CPU.
    Max_log_length=100 - количество строк отчета
    Storage_path=C:\Inetpub\wwwroot\re_cam\ - путь, для сохранения картинок. Если не задан, то в том же каталоге, что и программа. Тут указан путь к модулю IIS, отвечающему за показ картинок через HTTP.
    run_on_new_image= - если задано, путь и имя программы, выполняющейся при получении очередной картинки.
    run_on_start=run_on_start.bat - если задано, путь и имя программы, выполняющейся при запуске программы, в частности - старт IIS.
    run_on_close=run_on_close.bat - если задано, путь и имя программы, выполняющейся при остановке программы, в частности - остановка IIS.

    Модуль IIS (re_cam.dll) должен располагаться в каталоге IIS, настроенном на выполнение приложений, например:
    Команды web модуля:
  • вызов по умолчанию: http://.../re_cam/re_cam.dll - где ... имя или ip сервера и путь к модулю re_cam - будет возвращена картинка в формате jpeg из находящихся в том же каталоге сервера, что и re_cam.dll, имеющая наивысшую дату и время создания.
    Естественно, в такой конфигурации можно запрашивать у IIS непосредственно конкретную картинку, и без модуля, но как узнать ее имя?
    Если на web сервере есть поддержка например PHP или похожего - можно сделать и на нем. Для этого в архиве для примера приведены исходники web модуля.
    ToDo: правильнее было бы не картинку в ответ передавать, а делать редирект на нее и пусть ее уже сам web сервер клиенту отдает - так в общем то и было задумано, для этого несколько файлов и хранятся.
  • вызов страницы отчета: http://.../re_cam/re_cam.dll/Log - где ... имя или ip сервера и путь к модулю re_cam - будет возвращена страница отчета.
    Для того чтобы избежать кеширования картинок и данных можно добавлять доп поля к запросу, например: http://.../re_cam/re_cam.dll?rnd=случайное значение или http://.../re_cam/re_cam.dll/log?rnd=случайное значение
    Примеры картинок (камера установлена на кухне, на шкафу):
       
       
    Пример отчета web сервера:
    15.03.2011 10:40:33 ------------------------------------------
    15.03.2011 10:40:33 Начало работы
    15.03.2011 10:40:33 modulePath=\\?\c:\inetpub\wwwroot\re_cam\
    15.03.2011 10:59:59 ---- запрос картинки
    15.03.2011 10:59:59 Request.RemoteAddr:xxx.xxx.xxx.xxx
    15.03.2011 10:59:59 found 5 imgs!
    15.03.2011 10:59:59 img0:15105952.jpg C_DTM:15.03.2011 10:59:52 size:71413
    15.03.2011 10:59:59 img1:15105756.jpg C_DTM:15.03.2011 10:57:56 size:71519
    15.03.2011 10:59:59 img2:15105655.jpg C_DTM:15.03.2011 10:56:56 size:71470
    15.03.2011 11:00:00 img3:15105553.jpg C_DTM:15.03.2011 10:55:54 size:71463
    15.03.2011 11:00:00 img4:15105452.jpg C_DTM:15.03.2011 10:54:53 size:71814
    15.03.2011 11:00:00 Для показа выбран:
    15.03.2011 11:00:00 img0:15105952.jpg C_DTM:15.03.2011 10:59:52 size:71413

    Собственно а зачем все это мозга терзание? Ну во первых интересно, а во вторых это делалось как продолжение проекта подключение дисплея Siemens CX65 к компьютеру через USB, чтобы не держать открытым web браузер:
    - дома:
  • c USB камеры картинка попадает web серверу
  • web сервер отдает последнюю картинку по протоколу HTTP
    - на работе:
  • программа re_client периодически запрашивает домашний web сервер, грузит с него последнее изображение
  • запускает hid_lcd.exe picture=последнее полученное изображение
  • на бывшем дисплее телефона Siemens CX65 видим то, что было снято домашней USB камерой!

    Архив с программой и исходные тексты IIS модуля    Клиентская часть комплекса (программа re_client)    Подключение дисплея Siemens CX65 к компьютеру через USB
     
  •