Меню

Видеосервер для ip камер linux своими руками

Видеосервер для ip камер linux своими руками

Всем привет! В этой статье я хотел бы рассказать Вам о видеонаблюдении в 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, вас снова ждет интересное продолжение, пока!

Видеосервер для ip камер linux своими руками фото. Поделитесь новостью Видеосервер для ip камер linux своими руками с друзьями!
Видеосервер для ip камер linux своими руками 58
Видеосервер для ip камер linux своими руками 75
Видеосервер для ip камер linux своими руками 19
Видеосервер для ip камер linux своими руками 17
Видеосервер для ip камер linux своими руками 71
Видеосервер для ip камер linux своими руками 7
Видеосервер для ip камер linux своими руками 15
Видеосервер для ip камер linux своими руками 7
Видеосервер для ip камер linux своими руками 82
Видеосервер для ip камер linux своими руками 93
Видеосервер для ip камер linux своими руками 65
Видеосервер для ip камер linux своими руками 36
Видеосервер для ip камер linux своими руками 10
Видеосервер для ip камер linux своими руками 55
Видеосервер для ip камер linux своими руками 57
Видеосервер для ip камер linux своими руками 29
Видеосервер для ip камер linux своими руками 25
Видеосервер для ip камер linux своими руками 8
Видеосервер для ip камер linux своими руками 52
Видеосервер для ip камер linux своими руками 13