Видеосервер motion

Достаточно оставить кошелек на пару минут без присмотра, как он тут же переместится в иное измерение. Наверное стоит нанять охранника, который будет за умеренную плату контролировать зону интересов, квартиру, дом, двор или служебный кабинет. Мы вроде бы как программисты и возложим сей рутинный труд на технику, вернее на компьютер. Организовать свой собственный видеосервер не так уж и сложно. А в случае, когда ваши компьютеры управляются системой Линукс, одно только осознание факта, что такая система может работать годами, имеет высокую отказоустойчивость и еще стопятьсот различных плюсов, обещает как минимум хорошее настроение.

Видеосервер как правило обладает таким функционалом, как получение потокового видео с камер, записи сего содержимого, хранение, маркировка и представление для обозрения в режиме реального времени, а так же накопившихся архивов. Соответственно стоит возложить на него обязанность контролировать размер содержимого архива и своевременное удаление устаревших записей. Это не ограничение функционала, это минимум необходимого.

Я пожелал получать видеопоток с двух вебкамер, имеющих usb интерфейс. Звук мне пока не к чему. Запись должна срабатывать при наличии движения в зоне обслуживания камеры, синхронная маркировка сделанных записей. И самое главное, хочется получать видео в реал тайм по локальной сети на любом из компьютеров. В дальнейшем через интернет тоже.

Для сих целей избран motion, исходные коды которого доступны по указанной ссылке. Сборка и установка ведутся в обычном режиме.

Основной конфигурационный файл сервера — /etc/motion.conf

Я привел его к следующему содержанию:

daemon on
process_id_file /var/run/motion/motion.pid
setup_mode off
videodevice /dev/video0
v4l2_palette 8
input 8
norm 0
frequency 0
rotate 0
width 640
height 480
framerate 8
minimum_frame_time 0
netcam_http 1.0
netcam_tolerant_check off
auto_brightness off
brightness 0
contrast 0
saturation 0
hue 0
roundrobin_frames 1
roundrobin_skip 1
switchfilter off
threshold 1500
threshold_tune off
noise_level 32
noise_tune on
despeckle EedDl
smart_mask_speed 0
lightswitch 0
minimum_motion_frames 1
pre_capture 5
post_capture 5
gap 240
max_mpeg_time 600
output_all off
output_normal best
output_motion off
quality 75
ppm off
ffmpeg_cap_new on
ffmpeg_cap_motion off
ffmpeg_timelapse 0
ffmpeg_timelapse_mode daily
ffmpeg_bps 500000
ffmpeg_variable_bitrate 0
ffmpeg_video_codec mpeg4
ffmpeg_deinterlace off
snapshot_interval 0
locate off
text_right %Y-%m-%d\n%T-%q
text_left CAMERA %t
text_changes off
text_event %Y%m%d%H%M%S
text_double off
target_dir /home/motion/cam1
snapshot_filename %v-%Y%m%d%H%M%S-snapshot
jpeg_filename %v-%Y%m%d%H%M%S-%q
movie_filename %v-%Y%m%d%H%M%S
timelapse_filename %Y%m%d-timelapse
webcam_port 8081
webcam_quality 50
webcam_motion 8
webcam_maxrate 8
webcam_localhost off
webcam_limit 0
control_port 8080
control_localhost on
control_html_output on
track_type 0
track_auto off
track_motorx 0
track_motory 0
track_maxx 0
track_maxy 0
track_iomojo_id 0
track_step_angle_x 10
track_step_angle_y 10
track_move_wait 10
track_speed 255
track_stepsize 40
quiet on
sql_log_image on
sql_log_snapshot on
sql_log_mpeg off
sql_log_timelapse off
sql_query insert into security(camera, filename, frame, file_type, time_stamp, event_time_stamp) values('%t', '%f', '%q', '%n', '%Y-%m-%d %T', '%C')
; thread /etc/thread1.conf
; thread /etc/thread2.conf

Обратите внимание, что комментарии в файле открываются знаком «;».

Описанная конфигурация относится к одной usb камере, в случае подключения нескольких камер, их настройки вносятся в файлы thread*.conf для каждой из камер отдельно. Настройки, общие для всех устройств хранятся в /etc/motion.conf. Motion умеет работать не только с usb интерфейсом, но так же и с любой pci картой к которой подключаются камеры, а так же с сетевыми веб-камерами, ptz-камерами и другими устройствами, кроме утюгов и плоек. Программа имеет свой http-сервер, но я выбрал apache2, для более гибкого управления контентом, все равно индеец работает в сети. Его настройку описывать не буду. Настройка логирования событий в базу данных и функционал детекции слежения и ведения объектов — это тема отдельного разговора.

При написании конфигурационного файла следует обратить внимание на место, куда сливается видеоконтент, права на директорию и файлы. Так же важно правильно определить видеоустройство, которое соответствует подключенному оборудованию. Можно использовать /dev/video0, /dev/video1 и так далее, в соответствии с правилами отсчета. Но можно указывать прямой путь, например по id устройства в системе

/dev/v4l/by-id/usb-XPA4Y1096_1.3M_WebCam-video-index0

Итак, конфиги поправлены, камеры подключены, запускаем motion:

/etc/init.d/motion start

Если все в порядке, программа ответит «Ок» и уйдет в фон, если этого не случилось, читаем логи, курим конфигурационный файл, переключаем daemon on в положение off и смотрим отладку в консоли. Если программа запустилась, проверяем картинку в окне локального браузера по адресу http://localhost:8081 или какой у вас указан порт. У каждой из камер порт должен быть свой отдельный. Картинка есть, значит — ура. Если нет — возвращаемся в начало статьи.

Приведенные в конфиге настройки отвечают за появление достаточно «крупной тушки» в зоне работы камеры для момента реагирования сервера на включение записи, если чувствительность нужна более высокая, следует внести свои корректировки.

Для демонстрации видеоконтента с четырех камер в локальную подсеть, достаточно написать html-файл и уложить его в основную директорию индейца. Пример такого файла ниже.

Если файл именуется index.html и лежит в корневой директории апача, то соответственно при заходе на http://localhost мы будем видеть страничку с четырьмя окнами, в каждом из которых работает отдельная камера, то есть идет изображение. При заходе с другого компьютера в локальной сети следует лишь набрать адрес сервера и путь к описанному файлу. В общем, здесь полет мысли может быть любой.

Вот собственно краткий опус о том, как сделать простейший видеосервер в домашних условиях.

Пример файла:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My server</title>
<meta content="text/html; charset=UTF-8" charset="utf-8″"
http-equiv="Content-Type">
<style></style>
<meta content="Vasya Pupkin" name="author">
<meta content="Video cam from office" name="description">
</head>
<body
style="background-image: url(fon12.gif); background-color: gray; color: rgb(0, 0, 0);"
vlink="#551a8b" link="#0000ee" alink="#ee0000">
<center>
<h4 style="color: rgb(255, 255, 255);"><big style="font-style: italic;"><big><big><big>
Server</big></big></big></big></h4>
<a href="http://192.168.8.37:667"><small><small><span # здесь статистика даркстат
style="color: rgb(255, 255, 255);">Статистика darkstat eth1 (Local)</span></small></small></a><br>
<br>
<table width="80%" border="1" bordercolor="yellow">
<tbody>
<tr>
<td width="50%"> <img src="http://192.168.8.37:8081" width="100%"></td>
<td width="50%"> <img src="http://192.168.8.37:8082" width="100%"></td>
</tr>
<tr>
<td width="50%"> <img src="http://192.168.8.37:8083" width="100%"></td>
<td width="50%"> <img src="http://192.168.8.37:8084" width="100%"></td>
</tr>
</tbody>
</table>
</center>
</body>
</html>