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'а.

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