1 нояб. 2010 г.

Простое видеонаблюдение

Для Linux существует множество решений для видеонаблюдения, тот же Zoneminder, однако, большая их часть непригодня для использования среднестатистическим параноиком ввиду чрезмерной навороченности.

Совсем простое наблюдение можно организовать связкой fswebcam+cron+dropbox - это вполне очевидно и доступно каждому. Поэтому я решил сделать это при помощи связки motion+lighttpd±vloopback.

В чем, собственно, плюсы:
  • Возможность состряпать любой удобный веб-интерфейс
  • Можно смотреть mjpeg поток прямо в браузере
  • motion самостоятельно умеет делать скриншоты и/или видео при обнаружении движения
В качестве аппаратной части была взята веб-камера от A4Tech и допилена до инфракрасной в надежде, что потом будет сделана светодиодная ИК-подсветка.


Теперь о конфигах.
В конфиге Motion были изменены следующие опции:

#запуск motion демоном
daemon on
#мне не нужны автоматические снимки при обнаружении движения
output_normal off
#видеоролики тоже не нужны
ffmpeg_cap_new off
#время и дата перенесены в левую часть картинки
text_right
text_left %Y-%m-%d/n%T
#так текст лучше видно на маленьком экране мобильного телефона
text_double on


Конфиг Lighttpd совсем немного отличается от минимального:

#подключено несколько необходимых модулей
server.modules = ( "mod_auth", "mod_cgi", "mod_expire" )
#определены cgi которые нам нужны
cgi.assign = ( "nph-mjgrab" => "", "nph-mjprox" => "" )
#определено время устаревания для файлов
expire.url = ("index.htm" => "access plus 60 seconds", "index.2.htm" => "access plus 60 seconds" )
#настройки аутентификации
auth.debug = 0
auth.backend = "htdigest"
auth.backend.htdigest.userfile = "/etc/lighttpd/.lighttpd-passwd"
auth.require = ( "/" => ( "method"=>"digest", "realm"=>"auth req", "require"=>"valid-user" ) )


Для генерации файла htdigest используется одноименная утилита из пакета apache-tools
# /usr/sbin/htdigest -c /etc/lighttpd/.lighttpd-passwd "auth req" username

Упомянутые выше cgi нужно скомпилять из пакета MjpegProxyGrab. При этом нужно руками поправить путь к директории cgi-bin в Makefile
bindir = /srv/http/www/cgi-bin
По необходимости поправить #define'ы в исходниках - указать адрес, порт и лимит камер.
Еще можно поменять размер буфера, особенно если используется картинка больше чем 320х240 - в файле nph-proxygrab.c найти
char chbuffer[40000] = "";
и заменить 40000 на, например, 100000.

make && make install

Осталось только сделать пригодный вывод этого счастья.
Я сделал две html'ки в одной из них есть строка:
<img src="/cgi-bin/nph-mjgrab?1" width=320 height=240>
с помощью которой отображается один текущий кадр с камеры;
В другом
<img src="/cgi-bin/nph-mjprox?1" width=320 height=240>
для вывода mjpeg потока, который можно смотреть в любом нормальном браузере, вроде Firefox'а.

Авторефреш по вкусу.

3 комментария:

ViK комментирует...

интересно, а первопень осилит это?
надо бы ещё к этому добавить dallas 1 wire сеть с термодатчиками дома и на улице, найти хороший аккум для ups, часов так на 7-8 и опять привязать рутер к dyndns.
я, кстати, заставил работать мтсовский хуавей e1550 со своим дир320, у меня теперь есть какой-никакой анлим и призрачная надежа на 3г :)

M0nochr0me комментирует...

Точно, надо попробовать, а то мой бокс стоит без дела с тех пор как я бросил идею с самописным подобием MRTG :)
Опции framerate и minimum_frame_time должны помочь снизить нагрузку, если выставить их так чтобы камера опрашивалась реже чем раз в две секунды.

У меня еще есть задумка присобачить к системе подсветку, PIR сенсор и сервоприводы. Эх, мечты мечты)

M0nochr0me комментирует...

Все нормально - первопень, а точнее Cyrix M-II, осиливает. В обычном режиме motion хавает 1-1.6% cpu, при просмотре mjpeg потока в браузере 5.5-7%. Это при дефолтном framerate = 2.

PS: для подключения камеры к моей Zida TX98-3D пришлось угадывать распиновку USB методом тыка. Оказалось, что это JP15, выводы 1-5 и 11-15(реально 1-4 и 11-14), где 4 и 14 это GND.