Home / Posts / Видеонаблюдение, охрана и безопасность / Облачный сервер видеонаблюдения своими руками /


Облачный сервер видеонаблюдения своими руками



 Итак, продолжаю истязать несчастный видеорегистратор. Теперь стоит задача - наладить облачное видеонаблюдение. Но здесь я потерпел небольшое фиаско: для того, чтобы воспользоваться облачным сервером iVideon, мне потребовалась rtsp ссылка на видеопоток, которой у меня и не было.

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

 Решение пришло со стороны технологии EagleEyes, когда я открыл соответствующее окно на своем компьютере. Это не что иное, как стримминг видео. А с ним уже довольно легко сделать сервер видеонаблюдения своими руками.

Облачный сервер для видеонаблюдения 

 

 Оказалось, что на экране - картинка в формате jpg, а заправляет всем java-скрипт, который несколько раз в секунду обновляет эту картинку. Небольшой анализ кода вывел меня на необходимую нам ссылку.

 

 

 Собственно, по этой самой ссылке и находится "скриншот" с одной из камер в реальном времени. У меня сразу же появилась мысль написать PHP-скрипт, который, циклично выполняясь, будет "тягать" эти картиночки с заданным интервалом, и складывать их в папку на сервере. А с помощью другого скрипта можно будет просматривать их, сортируя по дате, к примеру. Тем более, что это будет куда менее затратно, чем транслирование видеопотока.

 В итоге я написал тестовый скрипт, который скачивает одну картинку. Сначала обращался напрямую к ip-адресу.

 Но, поскольку у меня, как я уже писал, ip-адрес динамический, нужно было использовать тот домен который я зарегистрировал на NO-IP. А как же, спрашивается, его использовать, если при обращении к домену сервер no-ip пытается перенаправить вошедшего на мой ip- адрес ?  Скрипт ведь не пользователь, он сразу выдает ошибку...

 Я некоторое время думал над тем, как вычислить редирект с сервера no-ip, пытался применить библиотеку curl, имитировал авторизацию... В конце концов до меня дошло, что можно извлечь адрес из HTTP - заголовков сервера. 

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

 Ниже, так сказать, тестовая версия скрипта с пояснениями.

<?php
global $time;
global $vtime;
global $freq;
global $crontime;
global $timesave;
$time = 5; //частота обращений к видеорегистратору, сек
$crontime = 400; //частота cron запуска скрипта , каждые * сек
$timesave = 1800; // время хранения скринов на сервере, сек. Сутки - 86400 сек
$login=""; //логин и пароль от видеорегистратора
$pass="";
$hostname=""; // домен от no-ip или ip-адрес роутера или видеорегистратора
$path="/";
function get_content($hostname, $path) //функция чтения заголовков
{
$line="";
$fd=fsockopen($hostname, 80, $errno, $errstr, 30);
if(!fd) echo "$errstr ($errno)/>\n";
else
{
$headers="GET $path HTTP/1.1\r\n";
$headers.="Host: $hostname\r\n";
$headers.="Connection: Close\r\n\r\n";
fwrite ($fd, $headers);
$end=$false;
while (!$end)
{
$line=fgets($fd, 1024);
if(trim($line)=="") $end=true;
else $out[]=$line;
}
fclose($fd);
}
return $out;
}
function deleteold($cam) // функция удаления старых изображений
{
global $timesave;
$path="cam".$cam."/";
$dir = opendir($path);
if((readdir($dir))!== false) {
foreach (scandir($path) as $v)
{
if ($v == '.' || $v == '..') continue;
$vnam = substr($v, 18, 28);
$dif = time() - $vnam;
if ($dif >= $timesave){
unlink($path.$v);
}
}
closedir($dir);
}
}
deleteold(3);
$cycle = $crontime / $time; //вычисляем, сколько циклов выполняется скрипт до следующего запуска от cron
$i=0;
while ($i <= $cycle)
{
set_time_limit(180);
$out=get_content($hostname, $path); //вызываем функцию чтения заголовков
$ip = $out[4];
$outset = strpos($ip,"http://", 0);
$ip = substr($ip, $outset + 7);
$ip = trim($ip); //получение чистого ip из заголовков сервера
$url="http://".$login.":".$pass."@".$ip."/cgi-bin/guest/Video.cgi?media=JPEG&channel=3"; //наша ссылка
$name = date( "d_m_y_H_i_s" )."-".time().".jpg";
copy ( $url, "cam3/".$name ); //копируем картинку в папку cam3
$i=$i+1;
sleep($time);
}

 

 Как видно, фотографии именуются в формате даты - 14_11_14_01_27_10-1415917630.jpg

 Сначала стоит дата в привычном формате для отображения в браузере, а после тире - абсолютное время в секундах, для удобства реализации функции удаления старых данных.

 Затем нужно было написать еще один скрипт для просмотра в браузере.

<?php
if ( !isset( $_GET["action"] ) ) $_GET["action"] = "wherecam";
if ( isset( $_GET["cam"] ) ) $cam = $_GET["cam"]; else $cam = 1;
if ( isset( $_GET["date"] ) ) $vdate = $_GET["date"]; else $vdate = 0;
global $time;
global $vtime;
global $freq;
$time = 5; //частота обращений к dvr сек
$vtime = 600; // промежуток просмотра сек
$freq = $vtime / $time;
switch ( $_GET["action"] )
{
case "wherecam":
wherecam(); break;
case "wheredate":
wheredate($cam); break;
case "view":
view($cam,$vdate); break;
default:
wherecam();
}
function wherecam() //выводим список камер
{
echo 'cam1';
echo 'cam2';
echo 'cam3';
echo 'cam4';
}
function wheredate($cam) //выводим список страниц просмотра - по заданным промежуткам времени
{
global $freq;
$path="cam".$cam."/";
$dir = opendir($path);
if((readdir($dir))!== false) {
$i = $freq;
$num = 0;
foreach (scandir($path) as $v)
{
if ($v == '.' || $v == '..') continue;
if ($i == $freq) {
$vname = substr($v, 0, 17);
echo ''.$num.'---'.$vname.'';
$i=0;
}
$i = $i+1;
$num = $num+1;
}
closedir($dir);
}
}
function view($cam, $vdate) //выводим, собственно, фотографии
{
global $freq;
$path="cam".$cam."/";
$dir = opendir($path);
if((readdir($dir))!== false) {
$num = 0;
$vdate_ = $vdate + $freq;
foreach (scandir($path) as $v)
{
if ($v == '.' || $v == '..') continue;
if ($num >= $vdate) {
if ($num <= $vdate_) {
$vname = substr($v, 0, 17);
$vnam = substr($v, 18, 28);
echo $num.'---'.$vname.$vnam.'';
echo '.$path.$v.';
}
}
$num = $num+1;
}
closedir($dir);
}
}

 

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

 По сути, получился какой-никакой сервер для облачного видеонаблюдения, пусть и не обеспечивающий качества, но тем не менее бесплатный и потребляющий минимум ресурсов.

 Для экспериментов я заказал тестовый период на одном из сервисов хостинга. Впрочем, я предполагаю, что подойдет и бесплатный хостинг с поддержкой PHP. Одна такая картинка весит около 3 кБ, соответственно, если предположить, что считываются скриншоты с двух камер каждые 5 сек, то за трое суток объем занимаемой памяти будет в пределах 300 МБ.

 

сервер для видеонаблюдения своими руками 

сервер облачного видеонаблюдения


,






Еще статьи по теме


rtsp ссылка на видеопоток
Как подключить видеорегистратор к интернету
Микрофон для видеорегистратора
Домашняя система видеонаблюдения
Охранная сигнализация своими руками
Домашняя система видеонаблюдения своими руками
Автоматическое открывание домофона
Сигнализация для дома своими руками
Электронный замок своими руками




Свежие статьи


Часы на газоразрядных индикаторах ИН-8
Инфракрасный барьер своими руками
Светодиодное освещение - продолжение эволюции
Часы на газоразрядных индикаторах ИН-12 (Nixie Clock)
Светодиодное освещение своими руками



Главная



Комментарии (0)











Мужской Проект

Подписка


Поиск