Главная » Контроль » Видеонаблюдение в Linux с помощью Motion
Видеонаблюдение в Linux

Видеонаблюдение в Linux с помощью Motion

Всем привет! В этой статье я хотел бы рассказать Вам о видеонаблюдении в Linux, а именно об инструменте Motion. С помощью программы Motion Вы сможете сделать за любой территорией, попадающей в поле зрения вышей веб-камеры, получать сообщения при обнаружении активности в заданной области, делать скрины, передавать изображение по сети и многое другое.

Вас также может заинтересовать статья «Приложения для видеонаблюдения на iPhone».

Видеонаблюдение в Linux

Программа Motion доступна для всех известных мне дистрибутивов Linux. Название говорит само за себя; кроме передачи движения, Motion может определять движение в определенной области кадра, отправлять сообщение при обнаружении активности в этой облас­ти, делать снимки, транслировать изображение по сети.

Motion ис­поведует в настройке Linux­way, конфигурационный файл хорошо комментирован, и если у вас нет проблем с английским (достаточ­но даже начального уровня), то понять смысл опций для вас не со­ставит труда.

Установка Motion

Итак, перейдем к установке. Вводим команду:

$ sudo apt-get install motion

Вам предложено будет вместе с основной утилитой установить несколько зависимостей. Соглашайтесь.

После скачивания и установки система попробует запустить Motion, но вы увидите сообщение:

[warn] Not starting motion daemon, disabled via /etc/default/ motion ... (warning)

То есть режим демона отключен. Включаем:

nano /etc/default/motion

Меняем в конце единственной строки “no” на “yes”.

Но это еще не всё, теперь тот же режим надо включить в другом файле:

nano /etc/motion/motion.conf

Ищем строки

# Start in daemon (background) mode and release terminal (default: off) daemon off

Меняем снова на “on” и запускаем Motion с конфигурационным файлом по умолчанию:

service motion start

Проверьте, стартовал ли сервис:

ps aux|grep motion
motion 19971 2.0 0.9 51316 8380 ? Sl 13:56 0:00 /usr/bin/motion

Всё в порядке. Есть желание посмотреть на сырые данные, которые камера отправляет на микро-НТТР-сервер? Тогда наберите из сессии SSH:

telnet localhost 8081

8081 — порт HTTP-микросервера по умолчанию, изначально доступен только локально (только с localhost), это мы потом поправим. Будьте готовы, что в окно терминала повалятся кракозябры, и корректно закрыть терминал не получится.

Откройте другой терминал и снимите процесс, который вы обнаружили на предыдущем шаге:

# kill 19971

Это было маленькое отступление, почти шутка. Зато вы теперь знаете, что с помощью telnet можно проверять активность сервисов на внешних портах localhost.

Настройка Motion «под себя»

Итак, где всё это веселое хозяйство, вы уже знаете: в /etc/motion/ motion.conf. Параметров много, но не очень. Файл являет собой шедевр конфигурационного файла — комментарии исчерпывающие, краткие и понятные.

Пройдемся по основным параметрам, чтобы интегрировать motion в наш ПД. Они будут не в порядке следования в файле, а в порядке важности (по моему мнению), и расположены в разных секциях:

# Videodevice to be used for capturing (default /dev/video0)
# for FreeBSD default is /dev/bktr0
videodevice /dev/video0

Видеоустройство. Благо, в 99 % случаев это оно и есть, так что оставляем как есть.

# The mini-http server listens to this port for requests (default: 0 =disabled)
webcam_port 8081

Порт встроенного web-сервера. Можно менять по желанию, только не попадите на какой-нибудь существующий порт, занятый нужной службой (типа 22, 23, 80, 143 и подобных).

# Restrict webcam connections to localhost only (default: on)
webcam_localhost off

Доступ к камере только с localhost; если стоит “on”, камера не будет видна из сети.

# Image width (pixels). Valid range: Camera dependent, default: 352<
width 320

Ширина картинки; для случая нашей камеры, максимум — 640.

# Image height (pixels). Valid range: Camera dependent, default: 288
height 240

Аналогично — высота, максимум — 480.

# Maximum number of frames to be captured per second.
# Valid range: 2-100. Default: 100 (almost no limit).
framerate 2

Количество кадров в секунду. Сами решайте; для нашего случая 2 в секунду самое то.

# 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

Этот параметр можно охарактеризовать как чувствительность при определении движения. Чем меньше значение, тем чувствительнее детектор.

# Noise threshold for the motion detection (default: 32) noise_level 32

Уровень шума. Позволяет игнорировать шум, создаваемый камерой. Установите оптимальное значение для своей камеры;меня устроило по умолчанию.

# 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 — правый нижний угол.

Если область не определена, то слежение происходит по всему экрану.

# The quality (in percent) to be used by the jpeg compression (default: 75)
quality 75

Качество jpeg-сжатия.

# Make automated snapshot every N seconds (default: 0 = disabled) snapshot_interval 0

Интервал в секундах, между которыми будут автоматически делаться снимки при наличии движения.

# 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

Позволяет рисовать рамку вокруг движущегося объекта. Интересная опция, попробуйте.

# 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

Рисуем ли текст на кадре; если да — то где и в каком формате.

# Target base directory for pictures and films
# Recommended to use absolute path. (Default: current working directory)
target_dir /tmp/motion

Каталог, в котором мы будем складывать файлы видео и картинки, далее подробно расписываются имена для разных вариантов записи.

Далее для краткости опишу сразу всю секцию:

# 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

[ 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) и перед тегом , добавьте строку:

Перезагрузите web-страницу — внизу, после кнопок, должна появиться область видеокамеры. Место width=“25%” делает окно видеопотока в 25 % от обшей ширины окна браузера; можете менять это число так, как вам нравится.

Ну что, всё? Можно праздновать победу? Ан нет. Давайте поразмышляем, что будет, если вы захотите «пробросить» порт web-сервера наружу, в Интернет. Сейчас я не про безопасность, а про то, что отобразится на дашборде. Ваш браузер будет искать адрес 192.168.0.30 в своей локальной сети. И точно не найдет открытый порт8081с видеопотоком.

Поэтому надо найти способ сделать так, чтобы браузер знал точный адрес хоста, на котором расположен ваш ПД. Положим, вы сделаете выход в Интернет через хост 111.222.333.444; тогда надо пробросить порт 8081 на этом хосте на внутренний IP-адрес 192.168.0.30 на тот же порт. И, убрав предыдущее изменение, добавить строку:

Успех? Попробуйте зайти из локальной сети. В случае удачи вы всё же увидите окно камеры. Но если вы используете динамический DNS, или неправильно прописали правила iptables на сервере, то вы не увидите ничего.

А нет ли способа узнать, на какой адрес мы стучимся? Пусть хост сообщит браузеру, какой его настоящий IP-адрес в данный момент. Тогда при доступе из локальной сети это будет 192.168.0.30, при доступе извне —тот IP-адрес, через который вы входите на свой дашборд.

Такой способ есть, для этого в php есть массив переменных $_SERVER. Он содержит информацию о заголовках, путях и местоположении скриптов. Записи в этом массиве создаются web-сервером. Для начала мы воспользуемся только одной переменной.

Определим функцию, которая будет извлекать полный путь к IP-адресу камеры и помещать ее в переменную. Внутри тегов ближе к началу страницы расположите строки:

function getUrl() {
$url = @( $_SERVER[“HTTPS”] != ‘on' ) ? ‘http://'.$_SERVER[“SERVER_NAME”] : ‘https://'. $_SERVER[“SERVER_NAME”];
$url .= “:8081”; return $url;
}

А в том месте, где вам надо вывести область камеры (опять-таки внутри кода php), расположите две строки:

$cam = getUrl();
echo “”;

Нужно ли комментировать этот великолепный прием, позволяющий независимо от протокола (HTTP или HTTPS) иметь верный IP-адрес сервера? Думаю, что не стоит.

В результате вы должны получить нечто, похожее на это:

Видеонаблюдение в Linux
Видеонаблюдение в Linux

Моя собака тоже решила принять участие в написании статьи про видеонаблюдение в Linux, а заодно показать себя. Если честно, она просто пытается достать печенье.

Небольшое замечание: с этого момента учитывайте загрузку командного контроллера. Одновременные запись информации на медленную карту памяти и вещание в дашборд могут перегрузить процессор. Если это станет критичным, отключите запись на диск (что там писать?). Достаточно будет закомментировать строку:

# target_dir /tmp/motion

в конфигурационном файле, и motion перестанет записывать, тем самым вполовину разгрузив процессор.

Ну что, теперь вполне можно показать первое приближение ПД кому-нибудь из домашних? Особенно если у вас наличествует смартфон с большим экраном, который можно использовать как пульт.

А в следующей статье про видеонаблюдение в Linux, вас снова ждет интересное продолжение, пока!

Оценка программы Motion

Наша оценка

Motion - это лучшая программа для организации видеонаблюдения в Linux. Наша оценка - отлично!

Оценка пользователей: 4.7 ( 2 оценок)

Один комментарий

  1. Игорь

    Лучшее решение для организации виденаблюления на Linux.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *