Всем привет! В этой статье я хотел бы рассказать Вам о видеонаблюдении в Linux, а именно об инструменте Motion. С помощью программы Motion Вы сможете сделать за любой территорией, попадающей в поле зрения вышей веб-камеры, получать сообщения при обнаружении активности в заданной области, делать скрины, передавать изображение по сети и многое другое.
Еще по теме: Приложения для видеонаблюдения на iPhone.
Видеонаблюдение в Linux
Программа Motion доступна для всех известных мне дистрибутивов Linux. Название говорит само за себя; кроме передачи движения, Motion может определять движение в определенной области кадра, отправлять сообщение при обнаружении активности в этой области, делать снимки, транслировать изображение по сети.
Motion исповедует в настройке Linuxway, конфигурационный файл хорошо комментирован, и если у вас нет проблем с английским (достаточно даже начального уровня), то понять смысл опций для вас не составит труда.
Установка Motion
Итак, перейдем к установке. Вводим команду:
1 |
$ sudo apt-get install motion |
Вам предложено будет вместе с основной утилитой установить несколько зависимостей. Соглашайтесь.
После скачивания и установки система попробует запустить Motion, но вы увидите сообщение:
1 |
[warn] Not starting motion daemon, disabled via /etc/default/ motion ... (warning) |
То есть режим демона отключен. Включаем:
1 |
nano /etc/default/motion |
Меняем в конце единственной строки “no” на “yes”.
Но это еще не всё, теперь тот же режим надо включить в другом файле:
1 |
nano /etc/motion/motion.conf |
Ищем строки
1 |
# Start in daemon (background) mode and release terminal (default: off) daemon off |
Меняем снова на “on” и запускаем Motion с конфигурационным файлом по умолчанию:
1 |
service motion start |
Проверьте, стартовал ли сервис:
1 2 |
ps aux|grep motion motion 19971 2.0 0.9 51316 8380 ? Sl 13:56 0:00 /usr/bin/motion |
Всё в порядке. Есть желание посмотреть на сырые данные, которые камера отправляет на микро-НТТР-сервер? Тогда наберите из сессии SSH:
1 |
telnet localhost 8081 |
8081 — порт HTTP-микросервера по умолчанию, изначально доступен только локально (только с localhost), это мы потом поправим. Будьте готовы, что в окно терминала повалятся кракозябры, и корректно закрыть терминал не получится.
Откройте другой терминал и снимите процесс, который вы обнаружили на предыдущем шаге:
1 |
# kill 19971 |
Это было маленькое отступление, почти шутка. Зато вы теперь знаете, что с помощью telnet можно проверять активность сервисов на внешних портах localhost.
Настройка Motion «под себя»
Итак, где всё это веселое хозяйство, вы уже знаете: в /etc/motion/ motion.conf. Параметров много, но не очень. Файл являет собой шедевр конфигурационного файла — комментарии исчерпывающие, краткие и понятные.
Пройдемся по основным параметрам, чтобы интегрировать motion в наш ПД. Они будут не в порядке следования в файле, а в порядке важности (по моему мнению), и расположены в разных секциях:
1 2 3 |
# Videodevice to be used for capturing (default /dev/video0) # for FreeBSD default is /dev/bktr0 videodevice /dev/video0 |
Видеоустройство. Благо, в 99 % случаев это оно и есть, так что оставляем как есть.
1 2 |
# The mini-http server listens to this port for requests (default: 0 =disabled) webcam_port 8081 |
Порт встроенного web-сервера. Можно менять по желанию, только не попадите на какой-нибудь существующий порт, занятый нужной службой (типа 22, 23, 80, 143 и подобных).
1 2 |
# Restrict webcam connections to localhost only (default: on) webcam_localhost off |
Доступ к камере только с localhost; если стоит “on”, камера не будет видна из сети.
1 2 |
# Image width (pixels). Valid range: Camera dependent, default: 352< width 320 |
Ширина картинки; для случая нашей камеры, максимум — 640.
1 2 |
# Image height (pixels). Valid range: Camera dependent, default: 288 height 240 |
Аналогично — высота, максимум — 480.
1 2 3 |
# Maximum number of frames to be captured per second. # Valid range: 2-100. Default: 100 (almost no limit). framerate 2 |
Количество кадров в секунду. Сами решайте; для нашего случая 2 в секунду самое то.
1 2 3 |
# Rotate image this number of degrees. The rotation affects all saved images as # well as mpeg movies. Valid values: 0 (default = no rotation), 90,180 and 270. rotate 0 |
Можно повернуть изображение на заданное количество градусов (если камера прикреплена подуглом).# Threshold for number of changed pixels in an image that # triggers motion detection (default: 1500) threshold 1500
Этот параметр можно охарактеризовать как чувствительность при определении движения. Чем меньше значение, тем чувствительнее детектор.
1 |
# Noise threshold for the motion detection (default: 32) noise_level 32 |
Уровень шума. Позволяет игнорировать шум, создаваемый камерой. Установите оптимальное значение для своей камеры;меня устроило по умолчанию.
1 2 3 4 5 |
# Detect motion in predefined areas (1 - 9). Areas are numbered like that: 1 2 3 # A script (on_area_detected) is started immediately when motion is 4 5 6 # detected in one of the given areas, but only once during an event. 7 8 9 # One or more areas can be specified with this option. (Default: not defined) ; area_detect value |
Позволяет следит только за определенной областью.
- 1 — левый верхний угол,
- 2 — верхняя средняя часть, …,
- 5 — центр, …,
- 9 — правый нижний угол.
Если область не определена, то слежение происходит по всему экрану.
1 2 |
# The quality (in percent) to be used by the jpeg compression (default: 75) quality 75 |
Качество jpeg-сжатия.
1 |
# Make automated snapshot every N seconds (default: 0 = disabled) snapshot_interval 0 |
Интервал в секундах, между которыми будут автоматически делаться снимки при наличии движения.
1 2 3 4 |
# Locate and draw a box around the moving object. # Valid values: on, off and preview (default: off) # Set to ‘preview' will only draw a box in preview_shot pictures. locate off |
Позволяет рисовать рамку вокруг движущегося объекта. Интересная опция, попробуйте.
1 2 3 4 |
# Draws the timestamp using same options as C function strftime(3) # Default: %Y-%m-%d\n%T = date in ISO format and time in 24 hour clock # Text is placed in lower right corner text_right %Y-%m-%d\n%T-%q |
Рисуем ли текст на кадре; если да — то где и в каком формате.
1 2 3 |
# Target base directory for pictures and films # Recommended to use absolute path. (Default: current working directory) target_dir /tmp/motion |
Каталог, в котором мы будем складывать файлы видео и картинки, далее подробно расписываются имена для разных вариантов записи.
Далее для краткости опишу сразу всю секцию:
1 2 3 4 5 6 7 8 9 |
# External Commands, Warnings and Logging: on_event_start value on_event_end value on_picture_save value on_motion_detected value on_area_detected value on_movie_start value on_movie_end value on_camera_lost value |
Выполняет определенное действие по наступлении определенных событий. В качестве value можно указать скрипт, например, оправляющий вам сообщение. Или включать музыку при обнаружении кого-либо. Всё ограничивается вашей фантазией и зависит от вашей цели.
Прочитайте внимательно — создатели предусмотрели практически всё, что нужно для эффективного наблюдения и регистрации событий.
Дальше идут параметры для связи с базами данных MySQL и PostgreSQL и настройки конфигов для нескольких камер. Не описываю: кто пользуется этими службами, настроит это сам.
Закрываем, перезапускаем motion: service motion restart
1 2 |
[ ok ] Restarting motion...[ ] Stopping motion detection daemon: motion. [ ok ] Starting motion detection daemon: motion. done. |
Заходим из локальной сети через браузер на IP-адрес сервера (на порт 8081, если вы его не изменяли) — например, так: http://192.168.0.30:8081/.
И наслаждаемся картинкой. Обратите внимание на нижний правый угол картинки — там стоят дата и время, ровно так, как мы задали в файле /etc/motion/motion.conf.
Но наслаждаемся недолго — вы же не будете открывать одно окно браузера для панели управления, а второе — для камеры? Сейчас очень модно стало слово «дашборд [dashboard]», означающее «приборная панель». Так вот, сведем на один дашборд кнопки и картинку.
Первый дашборд
Откройте файл, который выводит кнопки и индикаторы. У меня их несколько; обкатываю на index-test.php, потом переношу удавшиеся изменения в index.php.
В конец текста, после закрывающей скобки ?> (конец php) и перед тегом , добавьте строку:
1 |
<img src="“http://192.168.0.30:8081”" width="“25%”" /> |
Перезагрузите web-страницу — внизу, после кнопок, должна появиться область видеокамеры. Место width=“25%” делает окно видеопотока в 25 % от обшей ширины окна браузера; можете менять это число так, как вам нравится.
Ну что, всё? Можно праздновать победу? Ан нет. Давайте поразмышляем, что будет, если вы захотите «пробросить» порт web-сервера наружу, в Интернет. Сейчас я не про безопасность, а про то, что отобразится на дашборде. Ваш браузер будет искать адрес 192.168.0.30 в своей локальной сети. И точно не найдет открытый порт8081с видеопотоком.
Поэтому надо найти способ сделать так, чтобы браузер знал точный адрес хоста, на котором расположен ваш ПД. Положим, вы сделаете выход в Интернет через хост 111.222.333.444; тогда надо пробросить порт 8081 на этом хосте на внутренний IP-адрес 192.168.0.30 на тот же порт. И, убрав предыдущее изменение, добавить строку:
1 |
<img src="“http://111.222.333.444:8081”" width="“25%”" /> |
Успех? Попробуйте зайти из локальной сети. В случае удачи вы всё же увидите окно камеры. Но если вы используете динамический DNS, или неправильно прописали правила iptables на сервере, то вы не увидите ничего.
А нет ли способа узнать, на какой адрес мы стучимся? Пусть хост сообщит браузеру, какой его настоящий IP-адрес в данный момент. Тогда при доступе из локальной сети это будет 192.168.0.30, при доступе извне —тот IP-адрес, через который вы входите на свой дашборд.
Такой способ есть, для этого в php есть массив переменных $_SERVER. Он содержит информацию о заголовках, путях и местоположении скриптов. Записи в этом массиве создаются web-сервером. Для начала мы воспользуемся только одной переменной.
Определим функцию, которая будет извлекать полный путь к IP-адресу камеры и помещать ее в переменную. Внутри тегов ближе к началу страницы расположите строки:
1 2 3 4 |
function getUrl() { $url = @( $_SERVER[“HTTPS”] != ‘on' ) ? ‘http://'.$_SERVER[“SERVER_NAME”] : ‘https://'. $_SERVER[“SERVER_NAME”]; $url .= “:8081”; return $url; } |
А в том месте, где вам надо вывести область камеры (опять-таки внутри кода php), расположите две строки:
1 2 |
$cam = getUrl(); echo “<img src="$cam" width="\”25%\”" />”; |
Нужно ли комментировать этот великолепный прием, позволяющий независимо от протокола (HTTP или HTTPS) иметь верный IP-адрес сервера? Думаю, что не стоит.
В результате вы должны получить нечто, похожее на это:
Моя собака тоже решила принять участие в написании статьи про видеонаблюдение в Linux, а заодно показать себя. Если честно, она просто пытается достать печенье.
Небольшое замечание: с этого момента учитывайте загрузку командного контроллера. Одновременные запись информации на медленную карту памяти и вещание в дашборд могут перегрузить процессор. Если это станет критичным, отключите запись на диск (что там писать?). Достаточно будет закомментировать строку:
1 |
# target_dir /tmp/motion |
в конфигурационном файле, и motion перестанет записывать, тем самым вполовину разгрузив процессор.
Ну что, теперь вполне можно показать первое приближение ПД кому-нибудь из домашних? Особенно если у вас наличествует смартфон с большим экраном, который можно использовать как пульт.
Еще по теме: Как спрятать камеру видеонаблюдения.
А в следующей статье про видеонаблюдение в Linux, вас снова ждет интересное продолжение, пока!
Лучшее решение для организации виденаблюления на Linux.
Это конечно всё хорошо, но..:
1. Как сделать так, что бы Motion писал с камер видео со звуком?
2. Как сделать, что бы при заполнения жесткого диска видеозаписями, Motion автоматически подтирал старые?
Дружище, напиши статью как при помощи nmap искать чужие камеры и подбирать пароли к ним
после установки — убивает камеры на повал! пеерстают откликаться на простейшее mpv av://v4l2:/dev/video0 естественно в сеть тоже никакой трансляции не идет! пробовал на нескольких вебках и на современных и на доисторических времен xp — не взлетает!
пишешь скрипт на удаление файлов старше чем N дней в таргет дир мотион — и будет тебе счастье, со звуком вопрос открьіт
он автоматом переключает канал на -1 (т.е. телевизонный канал), что в случае к примеру вебкамеры работать не будет. В конфиге мотион нужно поменять параметр в строке input с -1 на 1 к примеру (у меня это тв-тюнер, через который подключена аналоговая камера через композитный вход).