Опрос


Что для Вас Умный Дом?


Результаты


Реклама


Видеонаблюдение через Интернет с записью архива

13/02/2010 13:16:42

Свет мой зеркальце скажи, да всю правду расскажи...

Черно-белая охранная камера для видеонаблюдения через ИнтернетВ предыдущих статьях  "Настройка видеонаблюдения своими руками", "Создание интерфейса умного дома на базе Web-сервера" и других я описал процесс организации видеонаблюдения используя операционную систему Linux и программный продукт ZoneMinder. Используя в качестве пользовательского интерфейса возможности Web-сервера Apache и различных модулей, систем и фреймворков для работы с контентом, можно создать вполне удобное и функциональное средство для мониторинга и управления Умным Домом в целом и видеонаблюдением в частности не только из локальной сети, но и через Интернет. Разумеется, сервер должен быть подключен к Интернету и иметь так называемый "реальный" IP-адрес, что, в случае 3G/EDGE/GPRS соединений не всегда доступно.

Предположим, Ваш сервер подключен к Интернету и Вы можете смотреть картинку с камер наблюдений онлайн. Само по себе это уже здорово, но далеко не всегда удобно и возможно круглосуточно смотреть в монитор. Зачастую требуется знать, что происходило на объекте в отсутствии он-лайн мониторинга. Программа ZoneMinder позволяет настроить систему на запись видео по заданным событиям, например, если определяет на картинке движение объектов. Но на практике существуют ситуации, когда это не работает. Например, использование широкоугольных объективов для наблюдения за большой площадью делает невозможным работу этого режима. Человек на изображении настолько мал, что ZoneMinder не может засечь движение, а если увеличивать чувствительность программы, то запись инициируется тенями от облаков, движением листвы или травы. Кроме того, работа режима motion detection требует значительных ресурсов сервера. Другим вариантом является запись всего видео подряд. Но если камера не одна, это также загружает систему, а вдобавок создает необходимость в дополнительном объеме на жестком диске. Однако наличие полного видеоархива хотя и позволяет детально ознакомится с событиями прошлого, но все же в ряде случаев является избыточным.

В своей системе я принял решение отказаться от записи видео, а ограничиться записью отдельных изображений с камер с частотой 1 раз в минуту, но зато с максимально возможным качеством. Таким образом за сутки генерируется 1440 JPEG файлов, общим объемом примерно 130-150Мб (разрешение 720х576). Такой подход совершенно не загружает систему, позволяет детально рассмотреть изображение с максимальным качеством, очень быстро найти изображение за определенные дату и время, а также реализовать автоматические алгоритмы упаковки и оптимизации архива. Можно значительно (до 3-х и более раз) уменьшить объем данных, снижая разрешение и качество получаемого изображения.

Но обо всем по порядку. Если вы не используете ZoneMinder, то захватить изображение с камеры можно с помощью утилиты v4ctl:

v4ctl snap jpeg full /var/www/snap/Camera1.jpg

В случае, если запущен ZoneMinder, сделать это можно примерно так:

cd /var/www/snap; zmu -m 1 -i -v

В данных примерах папка snap - это отправная точка моего видеоархива в структуре Web-сайта. Теперь у нас есть захваченное изображение с камеры в файле Camera1.jpg Но для организации архива этого мало. Я создал еще одну папку с именем archive и написал следующий скрипт на shell'е.

#/bin/sh
if [ ! -d /var/www/snap/archive/`date +%Y%m%d` ]
then
mkdir /var/www/snap/archive/`date +%Y%m%d`
fi
cp /var/www/snap/Camera1.jpg /var/www/snap/archive/`date +%Y%m%d`/`date +%Y%m%d%H%M`.jpg

Логика скрипта проста. Он создает папку с именем, сформированным из текущей даты (например 20100214 для 14 февраля 2010 года) и копирует туда полученный файл, также переименовывая его в текущую дату и время. Получается файл с именем 201002140105.jpg для той же даты и времени 01:15. Команду, получающую скриншот, а запуск скрипта мы прописываем в cron с нужной периодичностью.

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

<?
$my_date = $_REQUEST['my_date'];
$my_hour = $_REQUEST['my_hour'];
$my_pic = $_REQUEST['my_pic'];

if ( !empty($my_pic) )
echo "<img src="$my_pic">";
elseif ( empty($my_date) )
{
	echo "Показать архив за дату:<br>";
	foreach (glob("snap/archive/*") as $filename)
	echo "<a href=/archive.php?my_date=$filename>".preg_replace("/(dddd)(dd)(dd)/", "$1-$2-$3", basename($filename))."</a><br>";
}
else
{
	foreach (glob($my_date."/*.jpg") as $filename)
	{
		
		if ( preg_match("/.jpg$/", $filename) )
		$my_dir[$j++] = $filename;
	}

	sort($my_dir);

	if ( empty($my_hour) && count($my_dir) > 50 )
	{
		echo "Вывести за час: ";
		for ( $i = 0; $i < 24; $i++ )
		{
			if ( $i == 0 )
			$i1 = "zero";
			else
			$i1 = $i;
			echo "<a href=/archive.php?my_date=$my_date&my_hour=$i1>$i</a> ";
		}
	}
	else
	{
		for ( $i = 1; $i < count($my_dir); $i++ )
		{
			if ( (!empty($my_hour) && date("H", filemtime($my_dir[$i])) == $my_hour) || empty($my_hour) || ( date("H", filemtime($my_dir[$i])) == 0 && $my_hour == "zero" ) )
			echo "<a href="/archive.php?my_pic=$my_dir[$i]"><img src="/$my_dir[$i] border="0"></a>";
		}
	}
}

?>

Видеонаблюдение через Интернет своими руками
Видеоархив за определенный час и дату

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

Читатель может обратить внимание на тот факт, что занимаемый объем такого архива за месяц составит более 4Гб. Много? Согласен. Самое простое решение - удалять устаревшие файлы. В самом деле, вряд ли поминутный архив двухмесячной давности будет представлять практическую ценность. Тем не менее, совсем удалять файлы за определенную дату не хочется. Бывает очень любопытно посмотреть состояние объекта полгода или год назад. Интересно и то, какая была, к примеру погода - сыпал ли снег или светило яркое солнышко. Довольно быстро я пришел к следующему решению. По мере "старения" файлов, их нужно, так сказать, прореживать как морковку на грядке. Начиная с папок недельной давности мы удаляем половину файлов (каждый второй), делая таким образом архив с разрешением 1 кадр в 2 минуты. Еще через сутки, когда дата папки с архивом будет 7 дней и 1 день, в ней останутся данные изображения с периодичностью 1 кадр в 4 минуты. И так далее. До тех пор, пока файлов  в папке не окажется меньше 50.

<?
foreach (glob("/var/www/snap/archive/*") as $filename)
{
	foreach (glob("$filename/*") as $filename1)
	$my_dir[$i++] = "$filename1";
	$my_time = time() - 604800;
	if ( count($my_dir) > 50 && basename($filename) < date("Ymd", $my_time) )
	{
		for ( $j = 0; $j < count($my_dir); $j++ )
		{
			if ( $k == 1 )
			if ( !empty($my_dir[$j]) )
			unlink($my_dir[$j]);
			if ( $k == 0 ) $k = 1; else $k = 0;
		}
	}
}
?>

Оставшиеся 40-50 кадров в день уже не будут создавать проблему по части занимаемого объема на жестком диске, но дадут представление о том, что творилось в течение суток (1 кадр на 30-60 минут).

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



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



Сортировка комментариев: Последние сверху | Первые сверху

2013-03-13 22:48:43 | Andrey_B
Евгения, во-первых, у операторов может быть отдельная услуга (реальный или даже статический IP адрес). Я, кажется, видел такую услугу у Мегафона. Во-вторых, никто не запрещает купить какой-нибудь самый дешевый VPS/VDS аккаунт и поднять на нем что-нибудь типа VPN. Затраты от 1500 руб в год. Конечно, возни больше, зато и плюсы определенные есть.
Ну и в Самарской области ADSL/Ethernet весьма развит, нужно запросить техническую возможность у разных операторов. Еще посмотрите Wi-MAX.


2013-03-13 09:39:15 | Евгения
Добрый день! Подскажите пожалуйста, если получилось настроить доступ через 3G - через какого оператора? У нас в регионе (Самарская область) не могу найти ни одного с предоставлением статического, или хотя бы белого динамического IP. Может не там ищу...


2013-02-20 17:54:37 | Александр
Я новичек в програмировании, делаю все по инструкции, но у меня не работает вывод архива по дате.

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


2010-11-26 10:33:28 | Дмитрий
Чистить место можно и так по крону, например:
find /mnt/sdb1/motion/ ( -name '.swf' -o -name '.jpg' ) -mtime +50 -
Путь и шаблоны подставляем свои.


2010-08-19 12:34:56 | Alexandr
Если не собираетесь править картинки, то можно конвертировать в формат .DJVU, или
создать альбомы по месяцам, альбом займет место 30 -50 Mb
LINUX поддерживает DJVU
спасибо идея очень хорошая и бюджетная