Видеонаблюдение в FreeBSD с помощью motion, ffserver, ffmpeg

Программа motion позволяет вести запись и наблюдение с ip-камер или web-камер.
Первый вариант. Используется ip-камера в связке с motion. Тестировались камеры Ubiquiti Aircam mini и D-Link DCS-930L.
Установка motion:

# cd /usr/ports/multimedia/motion
# make install clean


Правим конфигурационный файл по адресу /usr/local/etc/motion.conf. Он отлично прокомментирован по умолчанию, оставлю только нужные опции:

daemon on
# Нужно будет создать папку motion по этому адресу, по дефолту не создается
process_id_file /var/run/motion/motion.pid
setup_mode off

Если используется веб-камера или аналоговая камера, то указываем путь к устройству:
#videodevice /dev/video0

# V4L2_PIX_FMT_SN9C10X : 0 ‘S910’
# V4L2_PIX_FMT_SBGGR8 : 1 ‘BA81’
# V4L2_PIX_FMT_MJPEG : 2 ‘MJPEG’
# V4L2_PIX_FMT_JPEG : 3 ‘JPEG’
# V4L2_PIX_FMT_RGB24 : 4 ‘RGB3’
# V4L2_PIX_FMT_UYVY : 5 ‘UYVY’
# V4L2_PIX_FMT_YUYV : 6 ‘YUYV’
# V4L2_PIX_FMT_YUV422P : 7 ‘422P’
# V4L2_PIX_FMT_YUV420 : 8 ‘YU12’

# У нас ip-камера, указываем данный режим:
v4l2_palette 2

input 8
norm 0
rotate 0

width 640
height 480

framerate 10

# Путь к котоку mjpeg камеры. В случае Ubiquiti Aircam mini это:
netcam_url http://172.16.0.105/snapshot.cgi
# В случае D-Link DCS-930L, путь будет вида http://172.16.0.105/video.cgi

Если нужно, указываем авторизацию к камере:
#netcam_userpass admin:admin
netcam_http 1.0
auto_brightness off

# Чувствительность камеры к движению:
threshold 2500

threshold_tune off

noise_level 32
noise_tune on
gap 60

# Максимальное время записи для одного видеофайла в секундах:
max_mpeg_time 2000

# Не будем делать снимки в формате jpeg:
output_all off
output_normal off
output_motion off
quality 75

############################################################
# FFMPEG related options
# Film (mpeg) file output, and deinterlacing of the video input
# The options movie_filename and timelapse_filename are also used
# by the ffmpeg feature
############################################################

ffmpeg_cap_new on
ffmpeg_cap_motion off
ffmpeg_timelapse 0
ffmpeg_timelapse_mode daily

# Качество видео (битрейт)
ffmpeg_bps 150000
ffmpeg_variable_bitrate 0

ffmpeg_video_codec mpeg4

ffmpeg_deinterlace off

snapshot_interval 0

# Наложение текста на видео
text_right %Y-%m-%d\n%T-%q
text_changes off
text_event %Y%m%d%H%M%S

# Увеличим размер текста:
text_double on

# Путь для сохранения видео:
target_dir /usr/local/www/motion/video

# Форматы имен файлов:
snapshot_filename %v_%Y_%m_%d_%H%M%S
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

############################################################
# HTTP Based Control
############################################################
control_localhost on
control_html_output on

quiet on

Здесь можно задать команды или скрипты, которые будут выполняться при каких-то событиях:
# Command to be executed when an event starts. (default: none)
# An event starts at first motion detected after a period of no motion defined by gap.
; on_event_start value

# Command to be executed when an event ends after a period of no motion
# (default: none). The period of no motion is defined by option gap.
; on_event_end value

# Command to be executed when a picture (.ppm|.jpg) is saved (default: none)
# To give the filename as an argument to a command append it with %f
; on_picture_save value

# Command to be executed when a motion frame is detected (default: none)
; on_motion_detected value

# Command to be executed when motion in a predefined area is detected
# Check option ‘area_detect’. (default: none)
; on_area_detected value

# 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
; on_movie_start value

# 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
; on_movie_end value

# Command to be executed when a camera can’t be opened or if it is lost
# NOTE: There is situations when motion doesn’t detect a lost camera!
# It depends on the driver, some drivers don’t detect a lost camera at all
# Some hang the motion thread. Some even hang the PC! (default: none)
; on_camera_lost value

# Если камер несколько, то здесь нужно указать пути к таким же конфигурационным файлам:
; thread /usr/local/etc/thread2.conf
; thread /usr/local/etc/thread3.conf
; thread /usr/local/etc/thread4.conf

Стартуем motion:

# /usr/local/etc/rc.d/motion start

Теперь у нас практически готова система видеонаблюдения. Видеозаписи сохраняются по адресу /usr/local/www/motion/video
Для просмотра видео в реальном времени можно задействовать демон ffserver и ffmpeg, идущие в комплекте с motion или же использовать веб-морду ip-камеры.
Я сделал проще, вставил в обычную html-страницу картинку с камеры с интервалом обновления 1 сек:

<html>
<head>
<meta http-equiv="Content-ype" content="text/html; charset=utf-8">
<title>Camera 1</title>
</head>
<body>
<br />
<br />
<div align="center" width="1024">
<span><b><h2>Camera 1</h2></b></span>
<IMG width="640" height="480" border="1" name="image1" style="border-color: #000;">
<SCRIPT language="JavaScript" type="text/javascript">
var t = 1 //интервал обновления
var img1 = "http://192.168.11.5/image.jpg?"
document.images["image1"].src = img1
Start(img1,"image1");
function Start(img, name) {
tmp = new Date();
tmp = "&"+tmp.getTime()
document.images[name].src = img+tmp
var delay = function() { Start(img, name); };
setTimeout(delay, t*1000)
}
</SCRIPT>
<br />
<span style="font-weight: bold;font-size: 18px;"><a href="files.php">FILES</a></sp
</div>
</body>
</html>
[/code]

Ещё возникла потребность как-то каталогизировать файлы записей. Для этого я использовал php-скрипт, его нужно положить на уровень выше чем, каталог с видеофайлами. Суть скрипта - раз в сутки (нужно поставить на крон) файлы записей раскладываются по папкам, имя которых - дата записи:

<?php
date_default_timezone_set('Europe/Moscow');
$dir = glob("video/*.avi");
foreach($dir as $fileAvi){
$data = date ("d-m-Y", filemtime($fileAvi));
@mkdir('video/'.$data, 0777, true);
$fileAviCastrat = str_replace('video/', '', $fileAvi);
copy($fileAvi, 'video/'.$data.'/'.$fileAviCastrat);
unlink($fileAvi);
}
?>[/code]

Чтобы вывести эти файлы и папки на html-страницу, используется такой скрипт:

<?php
function filesize_get($file){
if(!file_exists($file)) return "file not found.";
$filesize = filesize($file);
if($filesize > 1024)
{
$filesize = ($filesize/1024);
if($filesize > 1024)
{
$filesize = ($filesize/1024);
if($filesize > 1024)
{
$filesize = ($filesize/1024);
$filesize = round($filesize, 1);
return $filesize." GB";
}
else
{
$filesize = round($filesize, 1);
return $filesize." MB";
}
}
else
{
$filesize = round($filesize, 1);
return $filesize." KB";
}
}
else
{
$filesize = round($filesize, 1);
return $filesize." byt";
}
}
isset($_GET['file'])?$f=$_GET['file'].'/':$f='';
$dir = '/usr/local/www/motion/video/'.$f;
$files = scandir($dir);
$pos = 1;
foreach ($files as $file){
if($file != '.' &#038;& $file != '..'){
if(is_dir($dir.'/'.$file)){
echo '<b>' . $pos . ') <a href="?file='.$file.'">'.$file.'</a></b><br />';
}else{
if(strpos($file, '.avi')){
$filesize = filesize_get($dir.'/'.$file);
echo '<b>' . $pos . ')</b> <a href="/motion/video/'.$f.'/'.$file.'" type="application/octet-stream">'.$file . '</a> - '.$filesize.'<br />';
}else{
echo '<b>' . $pos . ')</b> '.$file . '<br />';
}
}
$pos++;
}
}
?>[/code]

________________________________________________________________________

Второй вариант. Используется ip-камера в связке с motion+ffmpeg+ffserver. Тестировались камеры Ubiquiti Aircam mini и D-Link DCS-930L.
В этом случаем можно организовать видео-трансляцию со своей камеры, если в ней нет веб-интерфейса. Для этого понадобиться донастроить ffserver и запустить ffmpeg.
Для этого настройки motion оставляем как есть (указаны выше, с помощью motion будет вестись запись). И настроиваем конфиг ffserver по адресу /usr/local/etc/ffserver.conf :

Port 8090
BindAddress 0.0.0.0
MaxClients 100
MaxBandwidth 20000
NoDaemon


File /tmp/feed.ffm
FileMaxSize 3M


Feed feed.ffm
Format flv
VideoCodec flv
VideoFrameRate 30
VideoBufferSize 80000
VideoBitRate 200
VideoQMin 1
VideoQMax 5
VideoSize 352x288
PreRoll 1
Noaudio


Feed feed.ffm
Format swf
VideoCodec flv
VideoFrameRate 30
VideoBufferSize 50000
VideoBitRate 100
VideoQMin 1
VideoQMax 5
VideoSize 352x288
PreRoll 0
Noaudio

Запускаем ffserver:

# /usr/local/etc/rc.d/ffserve start

Запускаем ffmpeg:

# ffmpeg -s 352x288 -r 15 -f mjpeg -i http://172.16.0.105:8081/stream.mjpg http://localhost:8090/feed.ffm

Теперь по адресу http://localhost:8090/test.swf имеем трансляцию в flash, которую можно встроить куда вам нужно.

17 Replies to “Видеонаблюдение в FreeBSD с помощью motion, ffserver, ffmpeg”

  1. Доброго времени суток!
    Возможны ли файлы записи без использования motion (ffserver+ffmpeg)? Если нет, то есть ли возможность заточить motion только под звук (без видео)?
    Очень хотелось бы каталогизировать файлы записей.
    Большое спасибо.

  2. Сделал всё как в статье, но к aircam motion не подключается.  В логах:

    Retrying until successful connection with camera
    libjpeg decompression failure on first frame — giving up!

     

      1. Парился я с мотион где то пол года, настроил 20 камер сетевых ушло на это уйма нервов и времени, пришла еще одна камера сетевая, бился с ней неделю потом плюнул на все и купил ПО xeoma и ни каких проблем 20 минут и сервер готов

  3. Добрый вечер!
    как прирутить звуковое сопровождение при обнаружении движения.
    …и хотелось бы очень увидеть примеры команд и скрипты разные к событиям.
    спасибо.

    1. опция on_motion_detected value отвечает за выполнение действия при обнаружении движения. Можно как указать ссылку на скрипт, который проиграет музыку/звук

  4. А вы не пробовали наоборот сделать? ffserver считывает rtsp поток с камеры и транслирует его на localhost, а motion уже берет этот поток с локалхоста и пишет видио по детекту.
    неделю бьюсь с этой связкой все без толку. Камеры AirCam, кстати первый вариант Вашей настройки получился. скормил motion этот поток netcam_url http://172.16.0.105/snapshot.cgi и все заработало. Вот не знаю, если с ffserver ни чего не получиться, то возможно придется использовать первый вариант. Еще есть мысли считывать RTSP поток Zoneminder-ом и отдавать его motion.
    В общем не могли бы вы написать, выложить, конфиги как подружить AirCam+motion+ffserver?

    1. Бился бился я с этими настройками, в конечном итоге установил zoneminder для rtsp камер. и motion забираю поток уже от туда. 4 месяца сервер пишет 15 камер, пока что без сбоев. Единственное что напрягает на записи иногда ускорение включается и 10 сек пролетают как одна. А так все норм. Кстати эти 15 камер motion в браузере тормознуто отдает, по этому для просмотра у охраны установил vlc плеер и на прямую им поток с камеры забираю. Решение конечно не ахти, но главное что работает и все довольны.
      Кстати кто нить в курсе у motion когда нибудь будет встроенная поддержка rtsp?

  5. В статье описан способ подключения к камере в одной подсети, а что если ip камера совсем 0в другом месте да еще и не с белым ip?
    Например у нас камера висит на 4g маршрутизаторе и ip плавает.
    Через mydlink все отлично видно, а вот как мой сервер freebsd заставить снимать видео с камеры ума не приложу.
    Может есть уже модуль доступа на mydlink на freebsd? (есть же такие програмки для андройда и айфона может и для freebsd есть? )

  6. Здравствуйте. Спасибо за статью, но у меня работает только одна из 2 веб камер хотя система определяет их, в конфиге моушн прописывал
    dev/video0 & dev/video1. подскажите может что-то не то прописал или что-то еще дописать?

  7. все разобрался может кому будет полезно:
    Если используется одна камера, файла motion.conf достаточно, но если их несколько, для каждой камеры понадобится подготовить персональный conf-файл. Общие для всех настройки оставляем в основном, а индивидуальные выносим в отдельные файлы. Кстати, в архиве уже есть несколько готовых шаблонов thread[1-4].conf. Если в будущем планируется расширение, то лучше сразу использовать thread-файл и подключить его в motion.conf при помощи конструкции:

    thread /usr/local/etc/thread1.conf

    Чтобы не путаться в конфигах, будем настраивать работу одной камеры в основном файле. Привести Motion в действие можно за счет правки нескольких параметров:
    В конфиге motion.conf в самом низу нужно прописать путь до threadX.conf затем В самом threadX.conf прописать все параметры аналогичны базовому, изменяются только необходимые строки
    к примеру
    videodevice /dev/video1
    text_left CAMERA 2
    target_dir /opt/data/current/video1

Добавить комментарий для Demolitionman Отменить ответ

Ваш адрес email не будет опубликован.