Видеонаблюдение в Linux
Ни для кого не секрет, что в наше время все следят друг за другом. Нет, не стоит пугаться, это не правительство и не инопланетяне(В общем не стоит исключать и таких вариантов). Все гораздо проще. Практически в каждой коммерческой фирме или госконторе, а зачастую, в школах и университетах, начальство устанавливает охранные системы. Под охранными системами обычно считают Охранно-Пожарные Системы(ОПС), Системы Контроля Доступа(СКД) и Системы видеонаблюдения. Вот про последние мы сегодня с вами и поговорим.
Введение
Все существующие системы видеонаблюдения можно условно разделить на два лагеря: построенные на базе видеорегистраторов и построенные на базе компьютера. Если с видеорегистратором все понятно(Подключили к нему монитор пошире, камер побольше, посадили охранника посмышленее и система работает), то с системой на базе компьютера(видеосервера) все немного сложнее. Во-первых нужно определиться с операционной системой под которой всё это будет работать, во-вторых нужно выбрать тот или иной программный продукт который и будет записывать интересные моменты из жизни офиса ну и в-третьих нужно купить компьютер и платы видеозахвата(в случае если используются аналоговые камеры).
Казалось бы, что вариант с видеорегистратором куда проще и доступнее, и, возможно, для небольших офисов/магазинов это самый лучший вариант, но что делать если нужно организовать систему по принципу – сидит охранник и мониторит 30 камер в 30-ти помещениях большого торгового центра, сидит начальник охраны и смотрит чего же делают охранники в его отсутствие, директор наблюдает за тем как работают его подчиненные(включая начальника охраны и секретаршу Машу которая любит сидеть в «Одноклассниках»), тем временем Генеральный Директор сидит дома и время от времени смотрит как работают люди в 4-ех его магазинах и 5-ти офисах, ну и наконец за всеми этими людьми следит Самый Главный Человек… – Системный Адмиистратор. Тут уже одним простым видеорегистратором не обойтись, нужно ставить(и не один) видеосервер способный отдавать картинку с камер по сети с разграничением прав и пользователей.
Выбираем
Во-первых нужно выбрать ОС. Как видно из названия статьи я рекомендую использовать Linux, по-тому что:
1. Это выгодно. Не нужно платить за лицензию на каждый сервер и удаленный компьютер наблюдения.
2. Это надежно. Правильно настроенный сервер на Linux’е будет служить вам верой и правдой не один год.
Во-вторых нужно выбрать программный продукт для регистрации видео.
Здесь кроется еще один плюс выбранной операционной системы. Дело в том что многие из существующих систем видеонаблюдения под линукс распространяются бесплатно(Будь то ZoneMinder, Motion или LinuxDVR(до 4ех камер в системе)), в то время как аналогичные системы под «другие ОС» стоят порядка 50-ти тысяч рублей(в зависимости от предполагаемого количества камер и количества компьютеров и серверов работающих в системе).
История успеха
Для себя я выбрал Motion.
Motion представляет из себя простую консольную программку со встроенным веб-сервером выводящим по указанному порту в формате MJPEG видеопоток с устройства video4linux(/dev/video*). Кроме того motion имеет встроенную систему регистрации движений в поле зрения камеры. Т.е. на диск пишется не все видео в режиме 24/7, а только тогда когда камера «видит», что что-то происходит, что существенно экономит место на диске и увеличивает максимальное время записи полезной информации на диск(В прочем, если нужно, то можно включить и постоянную запись).
Настройка
Настройка motion происходит через конфигурационный файл который по умолчанию расположен здесь:
/etc/motion/motion.conf
Про все пункты в этом файле вы можете прочитать в комманде man motion или же найти в гугле(благо в интернете информации по этому пакету достаточно), но пару пунктов из этого файлика я бы хотел выделить.
control_port 8080
control_localhost off
control_html_output on
control_authentication user:password
В этих четырех строках описан способ доступа к Web GUI настройки motion. В первой строке указан порт по которому нужно будет постучаться чтобы попасть в GUI, во второй строке разрешается/запрещается доступ к админке с адресов отличных от localhost’a(127.0.0.1), ну и в четвертой параметры авторизации(логин: пароль) для доступа к админке.
В админке есть все пункты настройки motion(даже те которые не прописаны в конфигурационном файле – стоят значения по умолчанию), с их кратким описанием.
Кроме того конфигурационные файлы очень удобно разбивать на «модули». Т.е. Основные настройки для всей системе хранить в файле /etc/motion/motion.conf, а настройки для каждой камеры хранить в отдельном файле, который потом можно будет подключить к основному файлу командой thread
Вот так у меня выглядит конфигурационный файл для системы с четыремя камерами:
/etc/motion/motion.conf:
framerate 15
ffmpeg_cap_new on
ffmpeg_cap_motion off
ffmpeg_timelapse 0
ffmpeg_timelapse_mode daily
ffmpeg_bps 400000
ffmpeg_variable_bitrate 0
ffmpeg_video_codec ffv1 #Вот тут мы выбираем кодек которым мы будем сохранять видео
ffmpeg_deinterlace off
max_mpeg_time 600
text_right %Y-%m-%d\n%T
text_changes off
text_event %Y%m%d%H%M%S
text_double off
snapshot_filename %v-%Y%m%d%H%M%S-snapshot
jpeg_filename %v-%Y%m%d%H%M%S-%q
movie_filename %Y.%m.%d/%H:%M:%S
timelapse_filename %Y%m%d-timelapse
output_normal off
webcam_quality 50
webcam_motion off
webcam_maxrate 50
webcam_localhost off
webcam_limit 0
control_port 8080
control_localhost off
control_html_output on
control_authentication user:password
quiet on
thread /etc/motion/thread1.conf
thread /etc/motion/thread2.conf
thread /etc/motion/thread3.conf
thread /etc/motion/thread4.conf
Жирным выделил 4 файла настроек для каждой камеры. Вот один из них:
/etc/motion/thread1.conf:
#Выбираем видеосутройство(Карта видеозахвата)
videodevice /dev/video0
#Выбираем номер канала
input 1
#Выбираем normid( PAL-DK, SECAM, etc. в зависимости от вашей камеры )
norm 3
#Вот тут самое интересное – порт на который будет транслироваться видеопоток в формате mjpeg
webcam_port 8081
#Текст который будет выводиться в левом нижнем углу картинки(Сюда можно название камеры написать)
text_left = «Camera Color»
#Директория куда будет сохраняться записанный видеоматериал
target_dir /opt/lampp/htdocs/bigbrother/Camera 1/
Интерфейс
Ну систему мы настроили и запустили. Камеры регистрируют любое движение и записывают все происходящее в специально подготовленную директорию. Остался один маленький вопрос. Куда смотреть чтобы в режиме реального времени следить за происходящим то? Помните строчку в конфигах webcam_port 8081? Вот если в адресной строке браузера зайти по адресу localhost:8081, то мы и увидим картинку с камеры в режиме реалтайм. Как видите ни о каком интерфейсе разговора нет. Можно конечно оставить все как есть. И для каждой камеры открывать отдельное окно браузера со своим портом. Но ведь гораздо приятней(да и удобней) видеть все в одном окне, как тут:
Тут то нам на помощь и придут базовые знания в html(а на HTML5, CSS3, JQuery, etc. можно нарисовать интерфейс который не будет уступать небраузерным клиентам). Делаем табличку втыкаем туда 4 тега , в качестве параметра src указываем localhost:8081, и любой бразуер будет показывать видеопоток в формате MJPEG.
Да, такая система требует небольших познаний в html, но в итоге получается очень гибкой и легконастраиваемой. Вот код моего рабочего примера на 4 камеры(см. скрин выше):
<html>
<head>
<title>BigBrother</title>
<META content=»text/html; charset=utf-8″ http-equiv=Content-Type>
<style></style>
</head>
<body bgcolor=gray>
<center>
<a href=»bigbrother»>Перейти к архиву</a> | <a href=#>Справка</a> | <a href=#>О программе</a>
<table border=1 bordercolor=green width=80%>
<tr>
<td width=50%>
<img src=»http://192.168.10.56:8081» width=100%>
</td>
<td width=50%>
<img src=»http://192.168.10.56:8082» width=100%>
</td>
</tr>
<tr>
<td width=50%>
<img src=»http://192.168.10.56:8083» width=100%>
</td>
<td width=50%>
<img src=»http://192.168.10.56:8084» width=100%>
</td>
</tr>
</table>
</center>
</body>
</html>
Кроме того, если все камеры подключены к серверу, а наблюдение ведется с удаленного компьютера, не совсем удобно добираться к записанному видеоматериалу. Нужно либо идти к серверу с флешкой(что совсем неправильно), либо поднимать ftp-сервер с авторизацией, либо написать еще один небольшой скрипт на php который будет следить за появление новых роликов и отдавать их клиентам. Тут уже решать вам самим. Для себя я выбрал последний вариант, потому-что его можно безболезненно встроить в интерфейс, он прост в понимании для охранников и позволяет им не отрываясь от своего любимого дела(Наблюдением за нарушителями на охраняемой ими территории), не закрывая интерфейса программы скачивать с сервера файл за тот или иной период записи.