DMZ
07:19 09-07-2009 Про домашнее видеонаблюдение
Не все голые сервера настраивать. Есть и общественнополезные занятия. Например, поставить видеонаблюдение.
Можно подъезд снимать, любимую машину под окном ночью или саму квартиру изнутри.

Собственно для видеонаблюдения на компе лучше не мучить себя с web-камерами, а взять сразу IP-камеру. Уже в пределах 100-150$ есть неплохие представители.
Основные минусы web-камер — низкое качество изображения и ограничение по длине USB-кабеля. Если камеру надо поставить в пяти метрах от компа и дальше, то надо пользоватся или хабами или активными какелями. IP-камеры уже хороши тем, что они цифрованный поток передают по обычному Ethernet (а особо продвинутые уже и по Wi-Fi). А тут уж длина ничем не ограничена (в пределах квартиры уж точно). Кроме того даже такая недорогая камера как D-Link DCS-920 (107$ в Красноярске) умеет Wi-Fi, умеет подключаться к интернету, определять движение в кадре, сохранять картинки и видео и пересылать все это по HTTP, FTP, SMTP (почта) и вещать в сеть (правда только в формате MJPEG).
Собственно подключил её к сети, настроил через web-интерфейс, указал куда складывать картинки и все. Дальше она сама всем займется.

Но если есть web-камера и покупать ip-камеру не охота, то и тут можно найти решение. Сперва, конечно надо разобраться с проводами, а потом уже мутить и софт.

Как оказывается, под Linux уже есть сервер, который умеет общаться с устройствами видео, определять движение в кадре и сохранять картинки и видео. Также Linux очень хорошо дружит с web-камерами. На ядре 2.6.26-2 моя Logitech QuickCam обнаружилась сразу же после подключения и заработала без пинков. Теперь ставим софт
sudo aptitude install motion ffmpeg

и настраиваем его по этой инструкции.

Плюс, я еще себе прописал
snapshot_interval 6
, чтобы каждые 6 секунд независимо от движеня сохранялась картинка.

В итоге получаем разные интересные картинки

[изображение]


Теперь также можно заходить браузером (или VLC) на камеру и смотреть видео в прямом эфире. Правда видео в формате MJPEG, и если захочется смотреть его через флеш плеер на сайте, то ничего не выйдет. Правда есть способы это победить, но все таки кодирование видео в реальном времени это ресурсоемкая задача. Двухядерный Intel Atom (2x1.6Ghz) кодирование MJPEG->FLV 320x240 16fps нагружает на 30-60%.

Через ffserver, который идет вместе с ffmpeg можно сделать такое правило преобразования (в /etc/ffserver.conf):
Port 8090
BindAddress 10.5.11.1
MaxClients 10
MaxBandwidth 50000
CustomLog -

#Feed — это вход для потока. Сюда будем потом слать данные
<Feed webcam.ffm>
  File /tmp/webcam.ffm
  FileMaxSize 5M
</Feed>

#Stream — это выход для потока. Он потом будет доступен по 
#адресу http://10.5.11.1:8090/webcam.flv
<Stream webcam.flv>
  #Кушаем фид
  Feed webcam.ffm
  #И кодируем его во флэш
  Format flv
  VideoBitRate 400
  VideoBufferSize 40
  VideoFrameRate 12
  VideoSize 320x240
  NoAudio
  VideoQMin 4
  VideoQMax 7
  Preroll 0
</Stream>


Для запуска и остановки ffserver-а можно применить найденный на просторах интернета скрипт
#!/bin/sh
#
# Initscript for ffserver
#
DAEMON="/usr/bin/ffserver"
DESC="Streaming server"
PIDFILE="/var/run/ffserver.pid"

start () {
        if start-stop-daemon --stop --quiet --pidfile $PIDFILE --signal 0
        then
            echo "already running."
            exit
        fi
        start-stop-daemon --start --quiet --exec $DAEMON > /dev/null 2>&1
        ps -ef | grep $DAEMON | grep -v grep | awk '{print $2}' > $PIDFILE
}

stop () {
        start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON > /dev/null 2>&1
        if test -f $PIDFILE ; then
            rm -f $PIDFILE
        fi
}

case "$1" in
  start)
        echo "Starting $DESC "
        start
        ;;
  stop)
        echo "Stopping $DESC "
        stop
        ;;
  restart)
        echo "Stopping $DESC "
        stop
        sleep 2
        echo "Starting $DESC "
        start
        echo "Done"
        ;;
  *)
        echo "Usage: /etc/init.d/ffserver {start|stop|restart}"
        exit 1
esac

exit 0

Кладем его в /etc/init.d/ffserver и обновляем
sudo update-rc.d ffserver defaults


Ну и теперь остается только перенаправить поток с камеры на сервер:
ffmpeg -s 4cif -y -an -r 4 -f mjpeg -i \ 
http://127.0.0.1:8081/stream.mjpg http://10.5.11.1:8090/webcam.ffm


Теперь берем любимый флеш-плеер, создаем HTML страничку и пишем код типа такого (на примере JW FLV Media Player):
	var s1 = new SWFObject("flvplayer.swf",'ply',"400","321","9");
	s1.addParam("allowfullscreen","false");
	s1.addParam('allowscriptaccess','always');
	s1.addParam("wmode", "transparent");
	s1.addVariable('file', 'http://10.5.11.1:8090/webcam.flv');
	s1.write("playeriu");