Саратов + 26 °C 

Храмы Высота ЧБ Люди Вокзалы Парк Зима. Снег Саратов Сад-огород. Хлеба Грибы Лес Зима. Снег Цветы Живность Кошки Река Хлеба Лес Зима. Снег Новый Год Небо. Облака Радуга Курьезы Река Хлеба Лес Зима. Снег Небо. Облака Курьезы Астро Зима. Снег Новый Год Шарм Эль Шейх. Тропикана Гранд Азур Кошки Ящерица Йошкар-Ола. Казань. Чебоксары Гуамское ущелье Майкоп Грибы Зима. Снег Лошади Сад-огород. Зима. Снег Должанка Египет Люди Санкт-Петербург Санкт-Петербург Финляндия Финляндия Греция. Родос. Детский Сад 158 Новый Год Авто Мото Макро Карта Дети Питание Шарм Эль Шейх. Тропикана Гранд Азур Астро Набережная Петрозаводска Карелия. Путешествия. Весна Макро Карта Отдых Лыжные прогулки Стихи CentOS Oracle SAMBA GlassFish LAMP Motion EJabberd Postfix. Dovecot. Amavisd Perl Jabber VLC M3U Ubuntu
Обои для рабочего стола. Лучшее качество 1600x1200.
ДНЕВНИКИ


Назад >> Сергей ШИБКА >> CentOS


06.06.2012 CentOC 5.x и Motion (видео и уведомление на E-mail,  уведомление в Jabber)

Настройка пакета Motion для отправки фрагментов видео на E-mail и уведомлений в Jabber.
 
После некоторых экспериментов, отправка на E-mail картинок не оправдала себя, т.к. многие почтовые сервисы распознают частую отправку за спам и блокирую отправителя, а это "не есть хорошо". Почему частая отправка получается? Очень просто, даже если выставить захват картинки с частотой 15 кадров в секунду, то эти кадры необходимо быстро отправить, чтобы оповестить получателя. А если пытаться с такой частотой подключаться к почтовому сервису, то тот незамедлительно отреагирует блокировкой. Конечно можно сделать отправку через какое-то время, но какой смысл делать задержку, когда необходимо наоборот как можно быстрее оповестить и отправить изображение. Поэтому для себя оптимальное решение, это отправка видео фрагментов по 30 секунд и уведомление в Jabber.
 
И так приступим, сам пакет Motion уже должен быть установлен и работать.
 
Правим конфиг motion.conf (ищем и приводим к нужному виду необходимые параметры):
 
# Maximum number of frames to be captured per second.
# Valid range: 2-100. Default: 100 (almost no limit).
# Сколько писать кадров в секунду. Выставляем 10
framerate 10
 
# Maximum length in seconds of an mpeg movie
# When value is exceeded a new mpeg file is created. (Default: 0 = infinite)
# Максимальная длинна записи отрывка видео. Выставляем 30 (секунд), т.е. видео будет писаться отрывками по 30 секунд.
max_mpeg_time 30
 
# Output 'normal' pictures when motion is detected (default: on)
# Valid values: on, off, first, best, center
# Захват движения в картинку. Отключаем, выставляем off
output_normal off
 
# Use ffmpeg to encode mpeg movies in realtime (default: off)
# Кодирование в реальном времени в mpeg при обнаружении движения. Включаем, выставляем on
ffmpeg_cap_new on
 
# Bitrate to be used by the ffmpeg encoder (default: 400000)
# This option is ignored if ffmpeg_variable_bitrate is not 0 (disabled)
# Битрейт кодирования. Оптимальный 1500000
ffmpeg_bps 1500000
 
# Codec to used by ffmpeg for the video compression.
# Timelapse mpegs are always made in mpeg1 format independent from this option.
# Supported formats are: mpeg1 (ffmpeg-0.4.8 only), mpeg4 (default), and msmpeg4.
# Используемый кодек. Выбран msmpeg4
ffmpeg_video_codec msmpeg4
 
# Use ffmpeg to deinterlace video. Necessary if you use an analog camera
# and see horizontal combing on moving objects in video or pictures.
# (default: off)
# Деинтерлейс. Убираем гребенку на изображении. Включаем, выставляем on
ffmpeg_deinterlace on
 
# Target base directory for pictures and films
# Recommended to use absolute path. (Default: current working directory)
# Путь для записи файлов
target_dir /mnt/Arch/video/cam1
 
# Command to be executed when a movie file (.mpg|.avi) is created. (default: none)
# To give the filename as an argument to a command append it with %f
# Выполняемая команда, когда начинается запись в файл, при обнаружении движения.
# В этом примере запускается скрипт jm.pl
on_movie_start /web/./jm.pl -cam=%f
 
# Command to be executed when a movie file (.mpg|.avi) is closed. (default: none)
# To give the filename as an argument to a command append it with %f
# Выполняемая команда, когда заканчивается запись в файл, при обнаружении движения.
# В этом примере запускается скрипт motion.pl
on_movie_end /web/./motion.pl -cam=%f

 
 
Скрипт jm.pl 
При исполнении скрипта происходит отправка уведомления в Jabber и E-mail на необходимые адреса. Скрипт стартует перед началом записи видео отрывка.
 
### jm.pl
#############################################################################
 
#!/usr/bin/perl -s
 
 
use Encode;
use Net::XMPP;
use Mail::Sender;
 
&Time_All;
 
#############################################################################
### Запись с камеры
#############################################################################
if ($cam ne '') {
 
$subject = "Внимание!!!
Перед камерой обнаружено движение.
Server Home.Ru $time_all
$cam";
$subject = encode("utf8", decode("cp1251", $subject));
 
@JID = ('monitor1@jabber.ru','monitor2@jabber.ru'); # На какие адреса идет отправка (если необходимо, перечисляем через запятую)
foreach $JID(@JID){
        &JM($subject, $JID);
}
 
$subject = "Движениепередкамерой. Server Home.Ru $time_all";
$message = "Внимание!!!
Перед камерой обнаружено движение.
$cam";
&Email;
 
}
###############################################################################
 
 
#############################################################################
### Отправки в jabber
#############################################################################
sub JM {
 
$body_messages = $_[0];
$body_messages = decode('utf8', $body_messages);
$body_messages = "#
$body_messages";
 
$jid_to = $_[1];
 
my $con=new Net::XMPP::Client();
 
$err_Connect = $con->Connect(hostname=>'jabber.ru'); # СереверJabber
 
$err_AuthSend = $con->AuthSend(username=>'monitor',
                               password=>'123456',
                               resource=>"Alarm!"); # ЗарегистрированныйаккаунтJabber. От его имени будет идти отправка
 
my $msg=new Net::XMPP::Message();
$err_SetMessage = $msg->SetMessage(to=>$jid_to,
                                   from=>'monitor@jabber.ru',
                                   body=>$body_messages);
                 
$err_Send = $con->Send($msg);
$con->Disconnect();
 
}
#############################################################################
 
 
#############################################################################
### Отправка уведомления на e-mail
#############################################################################
sub Email {
 
$subject = encode("utf8", decode("cp1251", $subject));
$message = encode("utf8", decode("cp1251", $message));
 
$from_email = 'monitor@mail.ru'; # От какого имени ящика идет отправка
 
@to_email = ('monitor1@mail.ru','monitor2@mail.ru'); # На какие адреса идет отправка (если необходимо перечисляем через запятую)
 
$hello_serv = $ENV{'SERVER_NAME'}; # $ENV{'SERVER_NAME'}
$host = "smtp.mail.ru"; # SMTP сервер
 
# Авторизация
$Email_auth_user = 'monitor@mail.ru'; # Логин ящика
$Email_auth_pass = '123456'; # Пароль
 
foreach $to_email(@to_email){
 
$sender = new Mail::Sender;
 
if ($sender->MailMsg({
   smtp => $host,
   from => $from_email,
   to => $to_email,
   subject => $subject,
   msg => $message,
   auth => 'PLAIN',
   authid => $Email_auth_user,
   authpwd => $Email_auth_pass
 }) < 0) {
  die "$Mail::Sender::Error\n";
 }
 $sender->Close;
 
sleep 10; # Пауза отправки письма
 
}
#
 
}
#############################################################################
 
 
###############################################################################
###  Формирования временных меток        
#############################################################################        
sub Time_All {
 
@months = ('Января','Февраля','Марта','Апреля','Мая','Июня','Июля','Августа','Сентября','Октабря','Ноября','Декабря');
@days = ('Вс','Пн','Вт','Ср','Чт','Пт','Сб');
($min,$hour,$mday,$mon,$year,$wday) = (localtime(time+($offset*3600)))[1,2,3,4,5,6];
 
  $min = "0$min" if ($min < 10);
  $hour = "0$hour" if ($hour < 10);
  $mday = "0$mday" if ($mday < 10);
  $year += 1900;
  $month = $mon+1;
  $month = "0$month" if ($month < 10);
 
$time_all = "$days[$wday] $mday $months[$mon] $year $hour:$min"; # Вывод времени(Ср16 Мая2007 08:42)
}
#############################################################################
 
 
#############################################################################

 
 
Скрипт motion.pl
При исполнении скрипта происходит отправка уведомления в E-mail с вложенным файлом видео отрывка на необходимые адреса. Скрипт стартует после окончания записи видео отрывка.
 
### motion.pl
#############################################################################
 
#!/usr/bin/perl -s
 
 
#############################################################################
use Encode;
use Mail::Sender;
 
&Time_All;
$subject = "Движениепередкамерой. Server Home.Ru $time_all";
$message = "Внимание!!!
Перед камерой обнаружено движение.
$cam";
&Email;
#############################################################################   
 
 
#############################################################################      
### Отправка уведомления на e-mail и вложенного файла
#############################################################################
sub Email {
 
$subject = encode("utf8", decode("cp1251", $subject));
$message = encode("utf8", decode("cp1251", $message));
 
$from_email = 'monitor@mail.ru'; # От какого имени ящика идет отправка
 
@to_email = ('monitor1@mail.ru','monitor2@mail.ru'); # На какие адреса идет отправка (если необходимо перечисляем через запятую)
 
$hello_serv = $ENV{'SERVER_NAME'}; # $ENV{'SERVER_NAME'}
$host = "smtp.mail.ru"; # SMTP сервер
 
# Авторизацией
$Email_auth_user = 'monitor@mail.ru'; # Логин ящика
$Email_auth_pass = '123456'; # Пароль
 
foreach $to_email(@to_email){
 
$sender = new Mail::Sender;
 
if ($sender->MailFile({
   smtp => $host,
   from => $from_email,
   to => $to_email,
   subject => $subject,
   msg => $message,
   auth => 'PLAIN',
   authid => $Email_auth_user,
   authpwd => $Email_auth_pass,
   file => $cam
 }) < 0) {
  die "$Mail::Sender::Error\n";
 }
 $sender->Close;
 
sleep 10; # Пауза отправки письма
 
}
#
 
}
#############################################################################
 
 
#############################################################################
### Формирования временных меток        
#############################################################################        
sub Time_All {
 
@months = ('Января','Февраля','Марта','Апреля','Мая','Июня','Июля','Августа','Сентября','Октабря','Ноября','Декабря');
@days = ('Вс','Пн','Вт','Ср','Чт','Пт','Сб');
($min,$hour,$mday,$mon,$year,$wday) = (localtime(time+($offset*3600)))[1,2,3,4,5,6];
 
  $min = "0$min" if ($min < 10);
  $hour = "0$hour" if ($hour < 10);
  $mday = "0$mday" if ($mday < 10);
  $year += 1900;
  $month = $mon+1;
  $month = "0$month" if ($month < 10);
 
$time_all = "$days[$wday] $mday $months[$mon] $year $hour:$min"; # Вывод времени(Ср16 Мая2007 08:42)
 
}
#############################################################################
 
 
#############################################################################

 
 
Таким образом, когда будет обнаружено движение, пакет motion начинает запись видео и запускается скрипт jm.pl, он отправляет уведомление на Jabber и E-mail адреса. После окончания записи видео, запускается скрипт motion.pl, он отправляет сообщение и вложенный файл видео отрывка. 30-ти секундный отрывок будет имеет размер около 3 - 5 мб.
 
В скриптах используются модули Net::XMPP, Mail::Sender, если их нет в системе, необходимо установить.


комментарии (3)


[ Назад ]


© 2005 - 2018 * Сергей Шибка