Всем привет!
Сегодня займёмся настройкой видеонаблюдения.
Зачем это нужно? Да для чего угодно.
Лично мне лень вставать из-за пк, чтобы посмотреть кто-же там пришёл. Я просто открываю браузер и смотрю.
Да и в добавок жуть как интересно, что-же там (в подъезде) происходит когда тебя нет, кто же всё-таки загадил весь подъезд.
Последнее, что меня окончательно надоумило ставить видеонаблюдение, так это статья в журнале «Хакер», где как раз и рассказывалось про то, как и из чего можно организовать слежку.
Итак, первое что нужно сделать, так это выбрать WEB камеру, которая поддерживается LINUX.
Я смотрел на ЭТОЙ страничке. Ещё можно глянуть ТУТ.
Мой выбор пал на Logitech QuickCam Messenger

Как её настроить для Linux на примере Debian можно прочитать ТУТ
Поскольку у меня Gentoo, из этой статьи я сделал вывод, что мне нужно:
а) Модуль v4l
б) Драйвер gspca (В современных ядрах Linux >2.6.27 он уже включён в набор)
Я пересобрал моё ядро (2.6.23) с поддержкой v4l
Сам-же драйвер я качал с его Home Page
cd /tmp
wget http://mxhaard.free.fr/spca50x/Download/gspcav1-20071224.tar.gz
tar xvfz gspcav1-20071224.tar.gz
cd gspcav1-20071224
make
make install #При необходимости, я не делал
depmod -a
modprobe gspca
Вставляем камеру в USB порт, она должна включиться.
Проверяем, что ПК её видит и Linux её опознал:
#lsusb
Bus 005 Device 001: ID 1d6b:0001
Bus 004 Device 001: ID 1d6b:0001
Bus 003 Device 001: ID 1d6b:0001
Bus 002 Device 002: ID 046d:08da Logitech, Inc. QuickCam Messanger
Bus 002 Device 001: ID 1d6b:0001
Bus 001 Device 001: ID 1d6b:0002
#dmesg| grep Logitech
drivers/media/video/usbvideo/quickcam_messenger.c: Logitech Quickcam Messenger USB v0.01
И должно появиться устройство в папке /dev/video0
У меня оно почему-то появилось в /dev/v4l/video0, я просто сделал сим.линк в /dev/video0
Уф, с первой частью покончили. Переходим ко второй: Установке ПО.
В качестве ПО я выбрал motion
Программа Motion способна контролировать сигнал, полученный с одной или нескольких видеокамер, и обнаруживать наличие изменений на картинке. На выходе получаем фотки в форматах jpeg, ppm или mpeg видеопоток, который может транслироваться в сеть или записываться в файл. При необходимости на указанный почтовый адрес может быть отослано сообщение с информацией о событии. Возможно выполнение любой предусмотренной пользователем команды или скрипта, поэтому реакция системы зависит только от твоей фантазии. Например, в Сети я видел информацию, как заставить Asterisk звонить на мобилу при обнаружении движения. Как вариант, Motion может просто захватывать кадры с указанного устройства через определенные интервалы времени или по команде cron.
Motion написан на языке Си, изначально разрабатывался для Linux, но может работать и в FreeBSD и Mac OS X. Поддерживаются все типы популярных сегодня видеокамер, подключаемых к компьютеру через USB порт, Video4Linux устройства и сетевые камеры. Драйверов для видеокамер проект Motion не предоставляет, поэтому прежде чем начинать настройку, убедись, что твоя камера видна операционке.
Фактически вся рабочая система представлена демоном, который потребляет небольшое количество системных ресурсов. В текущей версии 3.2 убраны практически все параметры командной строки запуска, поэтому установки производятся исключительно путем правки конфигурационных файлов. Никаких супер-пупер удобных графических инструментов для этих целей не предусмотрено. Хотя Motion имеет встроенный http-сервер, предназначенный для просмотра захваченного видео и прямой правки параметров в конфиге
Источник
Иными словами, Мы получаем всю систему с http сервером из коробки и без лишнего гемороя.
Нам потребуется:
ffmpeg
motion с включённым v4l и ffmpeg
В Gentoo ставиться так:
USE=»v4l ffmpeg» emerge motion
Притом, ffmpeg лучше взять тот, который рекомендуют разработчики. Ссылка.
C ffmpeg я напоролся на неприятность, дело в том что в Gentoo с Motion 3.2.11 (из репозитария) случилась беда.
Он падал при запуске с ошибкой сегментации.
Скачал Motion 3.2.10, но он почему-то не понимал что ffmpeg установлен.
В Gentoo ffmpeg лежит в /usr папке, путь указывается так: –with-ffmpeg=/usr
Тогда скачал последний Motion Daily Source Snap .
Он ffmpeg нашёл и начал работать, но видео не писал.
Запустил без режима демона «motion -n» и стал смотреть вывод.
Вылезла ошибка, что ffmpeg не может создать файл со словами: invalid argument.
Пришлось и ffmpeg ставить в отдельную папку и указывать её motion.
Напомню, как это делается:
sudo -i
cd /tmp
wget http://prdownloads.sourceforge.net/motion/ffmpeg-cvs-20060306-certified-with-motion-3.2.5.tar.gz
tar xvfz ffmpeg-cvs-20060306-certified-with-motion-3.2.5.tar.gz
cd ffmpeg
./configure –prefix=/usr/local/ffmpeg
make
make install
wget http://www.lavrsen.dk/sources/motion-daily//motion-daily-last.tar.gz
tar xvfz motion-daily-last.tar.gz
cd motion
./configure –prefix=/usr/local/motion –without-mysql –without-pgsql –with-ffmpeg=/usr/local/ffmpeg
make
make install
Т.е Мы собрали Motion без поддержки баз данных и установили в папку /usr/local/motion
Конфигурирование:
Переходим в папку /etc или /usr/local/motion/etc , и ищем там файл motion.conf или motion-dist.conf.
Если у Вас файл motion-dist.conf, то его следует переименовать в motion.conf
Сам-же файл очень подробно прокомментирован и описывать его не вижу смысла.
Лучше я Вам выложу свой рабочий конфиг для Motion 3.2.11.
Так же основные пункты перевидены в этой статье.
Далее запускаем motion -n или /usr/local/motion/bin/motion -n и смотрим вывод, если нет ошибок то всё ОК
Затем остаётся добавить motion в автозапуск и радоваться жизни.
Сокрытие и модификация камеры:
Следующий важный пункт это крепление камеры.
Я вырезал крепление из бутылки от шампуня, которую нашёл на улице и прикрутил выше двери.
Подставку пришлось сломать. Зелёный светодиод заклеил лейкопластырем.
фото:

Камера
Купил USB удлинитель на 5 метров + ~1 метр от камеры. Всё работает.
Теперь модификация:
Делаем камеру инфракрасной
Отличная статья как это сделать и зачем это нужно ТУТ
Коротко: Смысл в том, что нужно снять ИК-фильтр из объектива камеры.
Результат:
Лучше всяких слов скажет видео, снятое моей подъездной камерой:
http://www.youtube.com/watch?v=x0otGil03Fo
Остальное доступно тут: http://www.youtube.com/davnozdubv
Сам такое задумал. ;) Есть свободный, старый ноут.
Кстати, вопрос – длинна кабеля не влияет на скорость передачи?
И еще – не было желания посмотреть что происходит пролетом выше? ;)
Комментарий от BITCreator — Февраль 14, 2009 @ 2:25 дп
По стандарту USB 2.0 больше 5 метров не рекомендуют. Хотя на деле, если кабель качественный то всё работает нормально. У меня 6.3 метра.
На счёт пролёта, я на последнем этаже живу.
Комментарий от itbg — Февраль 14, 2009 @ 2:32 дп
а 12 метров можно?
у меня в коридоре висит роутер, до него от подъезда как раз 12 метров :)
Комментарий от kaliy — Февраль 14, 2009 @ 11:02 дп
Попробуй. Всё зависит от кабеля. В принципе можно какой-нибудь hub с внешним питание в середине поставить.
Комментарий от itbg — Февраль 14, 2009 @ 11:27 дп
Отличная статья.
в списке http://mxhaard.free.fr/spca5xx.html есть столбец «тип потока», что это такое, на что влияет ?
Комментарий от Aleksey — Февраль 15, 2009 @ 1:45 дп
Понятия не имею, главное что видео пишет.
Комментарий от itbg — Февраль 15, 2009 @ 1:54 дп
столбец “тип потока”?
там есть столбец «Stream»
он показывает в каком формате камера будет возвращать картинку,
yuyv – это не сжатые данные(цветоразносная данные)
jpeg – каждый кадр представляет собой отдельную картинку упакованную в jpeg.
mjpeg – выдает на выход поток из jpeg картинок, у потока свой формат.
gbrg – наверное вариации RGB.
Комментарий от Yevgen — Февраль 17, 2009 @ 11:36 дп
Привет, не мог бы ты выложить скрины браузера транслирующего видео, есть ли там Web-интерфейс для конкурирования?
Комментарий от Alex — Февраль 20, 2009 @ 5:10 пп
Там одно окно с видео и всё.
WEB интерфейс для конфигурирования есть, он доступен на отдельном порте (см конфиг).
Из себя представляет обычный список параметров и возможностью их изменить.
Графика отсутствует.
Комментарий от itbg — Февраль 20, 2009 @ 9:26 пп
А вот эту штуку разьюзать не побывал? о ней что нить может сказать?
http://avreg.net
Комментарий от Alex — Февраль 20, 2009 @ 10:42 пп
Нет, не пробывал.
А смысл? Меня motion на 100% устраивает.
Он активно развивается, стабилен, лёгок в установке, присутствует в репозитариях да и возможностей больше.
Этот же продукт судя по описанию с WEB камерами вообще не работает и сис. требования у него громадные (ЦПУ – 3 ГГц). И только для Debian/Ubuntu.
САМОЕ ОТВРАТИТЕЛЬНОЕ: ЛИЦЕНЗИЯ.
Она платная, или с ограничениями.
Такое нафиг не нужно, исходников нет (возможно они и лицензию GNU нарушают и сорцы боятся выкладывать), ТП отсутствует, не OpenSource ребята делают. У продукта нет будущего, его видимо продают и будут продавать только в комплекте с камерами.
Лично я к неизвестным проектам отношусь с недоверием, да и в такой области как безопасность это решает многое.
Комментарий от itbg — Февраль 20, 2009 @ 11:12 пп
а что щас модно вылаживать конфиги на http://www.mediafire.com? может лучше на TPB ?
Комментарий от me — Февраль 27, 2009 @ 11:28 пп
Мне туда удобнее.
Комментарий от itbg — Февраль 27, 2009 @ 11:45 пп
В общем все бы хорошо, но вот что я вижу при выполнении make
gcc -L/usr/local/ffmpeg/lib -o motion motion.o logger.o conf.o draw.o jpegutils.o vloopback_motion.o video.o video2.o video_common.o netcam.o netcam_ftp.o netcam_jpeg.o netcam_wget.o track.o alg.o event.o picture.o rotate.o webhttpd.o stream.o ffmpeg.o -lm -lpthread -ljpeg -L/usr/local/ffmpeg/lib -lavformat -lavcodec -lavutil -lm -lz
/usr/bin/ld: cannot find -lz
collect2: выполнение ld завершилось с кодом возврата 1
make: *** [motion] Ошибка 1
make install
Installing files…
——————————————————————————–
mkdir -p /usr/local/motion/bin
mkdir -p /usr/local/motion/share/man/man1
mkdir -p /usr/local/motion/etc
mkdir -p /usr/local/motion/share/doc/motion-trunk-r442
mkdir -p /usr/local/motion/share/motion-trunk-r442/examples
install motion.1 /usr/local/motion/share/man/man1
install CHANGELOG COPYING CREDITS INSTALL README motion_guide.html /usr/local/motion/share/doc/motion-trunk-r442
install *.conf motion.init-Debian motion.init-RH motion.init-FreeBSD.sh /usr/local/motion/share/motion-trunk-r442/examples
install motion-dist.conf /usr/local/motion/etc
for prog in motion; \
do \
(install $prog /usr/local/motion/bin ); \
done
install: невозможно выполнить stat для `motion’: No such file or directory
make: *** [install] Ошибка 1
Комментарий от Alex — Апрель 3, 2009 @ 3:42 дп
Проблему пришлось решать иным путем!
1. Снес все.
2. поставил motion через apt-get install motion
3. поставил пакет gstreamer0.10-ffmpeg
4. в конфиге в качестве кодека указал ffv1 – FF video codec 1 for Lossless Encoding ( experimental )
Теперь все пучком, пишет как по маслу, видео сохраняется без проблем.
Комментарий от Alex — Апрель 3, 2009 @ 3:47 дп
Все прекрасно кроме одного, после запуска, motion пишет без остановки, вне зависимости от того есть движение или нет. я ковырялся в конфиге но так и ничего решить не смог.
не подскажешь в чем проблема?
Комментарий от Alex — Апрель 3, 2009 @ 4:28 дп
осенило в 4 ночи! проблема решена!
Комментарий от Alex — Апрель 3, 2009 @ 5:29 дп
Рад за тебя.
Комментарий от itbg — Апрель 3, 2009 @ 10:00 дп
Подскажите, прочитал конфиг вроде все настроил, но вот вопрос как его заставить писать видео по расписанию??? Или просто запускать и тушить через крон?
Комментарий от Zanzy — Апрель 7, 2009 @ 6:04 пп
Дело в том, что motion начинает писать видео, если есть какое-то движение.
Как только движение прекращается, то и запись останавливается.
Параметры срабатывания настраиваются в конфиге
Если Вам нужно писать всё видео, то лучше воспользоваться программой mplayer например.
Синтаксис для записи видео я описывал, поищите в моём блоге.
Комментарий от itbg — Апрель 7, 2009 @ 7:58 пп
Всем привет.
Ребята, подскажите, плиз.
Есть 4 магазина. В каждом стоит по серверу линуксовому с motion. + один стоит в офисе. На последнем есть веб-морда, с которой можно посмотреть любые камеры со всех магазинов по городу.
Стала такая задача: чтобы просматривать видеозапись за какой-то период (допустим, посмотреть, что было в 9 утра в 3-ем магазе), нужно скачивать целиком файл записи за сутки – тянуть 400МБ по инету (магазы соединены ВПН-ом через инет) не удобно, если нужно срочно. Как можно разбивать записи, хотя бы по часу?
Комментарий от Cornelius — Апрель 9, 2009 @ 12:18 пп
Самый оптимальный для Вас выход – поднять видеовещание по типу YouTube
Есть плеер на Flash – FlowPlayer
Меняешь кодек записи на тот, который он поддерживает.
Плеер является открытым, так что сможешь модернизировать если потребуется.
Далее просто будешь выбирать файл и смотреть сразу видео с перемоткой.
Комментарий от itbg — Апрель 9, 2009 @ 9:43 пп
Посмотрел конфиги:
max_mpeg_time = 0
ffmpeg_timelapse_mode = hourly
А пишет посуточно. Где это выставлено может быть?
Комментарий от Cornelius — Апрель 9, 2009 @ 1:02 пп
Спасибо, понял. А, как временное решение, можно где-то выставить, чтобы он файлы разбивал по часу, а не по суткам?
Комментарий от Cornelius — Апрель 10, 2009 @ 11:36 дп
Если будешь через FlowPlayer видео смотреть, в Motion кодек поменяй на flv
ffmpeg_video_codec flv
Может так попробывать?
ffmpeg_timelapse 3600 # 3600 секунд = 1 час
ffmpeg_timelapse_mode manual
А такая строка помогла?
ffmpeg_timelapse_mode hourly
Комментарий от itbg — Апрель 10, 2009 @ 1:19 пп
«А такая строка помогла?
ffmpeg_timelapse_mode hourly» – так оно уже и стояло до меня, пишет 1 файл = 1 сутки (около 400 метров).
На счет 3600 сек щас попробую.
Комментарий от Cornelius — Апрель 10, 2009 @ 1:24 пп
Немного не понял, как этот плеер проинсталлировать. Он на сервер ставится или клиентам?
Комментарий от Cornelius — Апрель 10, 2009 @ 2:27 пп
Всё очень просто.
В html страничку код плеера вставляешь.
В доках всё написано.
Сам плеер на сервер закидываешь.
Пишешь скрипт, который плейлист каждые 5 минут (или день?) новый генерирует.
Или что-нибудь типо того…
Локально плеер не работает (без WEB сервера), ему обязательно WEB сервер нужен.
Это связанно с безопасностью Flash
Всё будет выглядеть как на его главной страничке.
Собственно он там в качестве примера и стоит.
Отличная документация есть тут:
http://flowplayer.org/demos/index.html
Если не секрет, а зачем всё подряд писать?
У меня запись включается только при движении.
Комментарий от itbg — Апрель 10, 2009 @ 3:50 пп
Ок, попробую поковырять сегодня плеер.
Камеры стоят в магазинах – там постоянно движение, круглосуточно. Поэтому бессмысленно пробовать эту настройку.
Спасибо еще раз, буду пробовать. Отпишусь потом.
Комментарий от Cornelius — Апрель 10, 2009 @ 4:05 пп
За запись по часу точно отвечает параметр
ffmpeg_timelapse_mode
А вот и его описание:
http://www.lavrsen.dk/foswiki/bin/view/Motion/ConfigOptionFfmpegTimelapseMode
Может попробывать обновить версию motion ?
Комментарий от itbg — Апрель 10, 2009 @ 7:52 пп
Блин, так не хочется трогать :-)
4 сервера + еще один, который, кроме своих камер (8штук), выводит картинки с остальных 4-х серверов.
Боюсь, что если уроню, то заново ставить долго буду
Комментарий от Cornelius — Апрель 10, 2009 @ 8:58 пп
Поставь в отдельную папку из сорцов.
Там же ключ для компиляции есть:
--prefix=Поставь отдельно и попробуй.
Комментарий от itbg — Апрель 10, 2009 @ 9:19 пп
Ок, спасибо. Попробую, но уже в понедельник. Удачных выходных всем
Комментарий от Cornelius — Апрель 10, 2009 @ 9:26 пп
motion -n
[0] Motion 3.2.11 Started
[0] ffmpeg_init: ffmpeg LIBAVCODEC_BUILD 3412992 LIBAVFORMAT_BUILD 3415808
Что за беда ума не приложу. у меня правда opensuse, но там установив другую версию motion она вроде аботает и фотографирует, но только фотографирует. Чёт, олазанье в конфиге ни к чему не привело.
Комментарий от Андрей — Май 12, 2009 @ 9:53 пп
ffmpeg – в нём проблема.
Собери его руками из исходников и поставь в отдельную папку.
Качай саму последнюю версию, или ту которая на сайте рекомендована, хотя она там очень старая.
Сам долго мучился, пока подходящую не подобрал.
Вроде у меня такая стоит – ffmpeg-checkout-2009-03-06
Хотя не уверен, просто их у меня 2 разных штуки лежат.
А с какой собирал уж не припомню
Вот какие у меня там лежат:
1)
2)
Комментарий от itbg — Май 12, 2009 @ 10:02 пп
Благодарствую, продолжим работу.=)
Комментарий от Андрей — Май 12, 2009 @ 11:48 пп
Хммм…теперь встал вопрос как сделать чтобы логин пароль спрашивал при входе?( видео пока не настроилось , но стал фотографировать и в http браузере можно поглядеть на себя, а если часто обновлять страницу то как будто видео=))То что в хакере написано не понял, никакой реакции на control_authentication username:password и иже с ним не происходит, если в веббраузере изменять настройки, так вообще не сохраняет это поле. как у тебя в конфиге это было сделано?
Комментарий от Андрей — Май 13, 2009 @ 11:52 дп
У меня WEB сервер motion картинку автоматически обновляет, с помощью javascript (всё из коробки).
Сам я аутентификацию не делал.
Вот что удалось найти на официальном сайте:
http://www.lavrsen.dk/foswiki/bin/view/Motion/ConfigOptionControlAuthentication
По идеи Тебе нужно расскомментировать это поле и написать туда имя пользователя и пароль.
Пример:
Что интересно, в моём конфиге вообще такого поля нету, хотя я собирал motion из сорцов.
И в default конфиге такой строки не обнаружил.
Как вариант, можешь трансляцию видео вообще выключить, ограничить только localhost’ом или на другой порт перевешать.
Комментарий от itbg — Май 13, 2009 @ 2:53 пп
А видео со звуком получится транслировать/записывать?
Комментарий от ShurGent — Май 28, 2009 @ 3:17 пп
Motion только пишет видео.
Можно звук отдельно писать, а затем накладывать на видео.
Комментарий от itbg — Май 28, 2009 @ 4:34 пп
Т.е. транслировать в интернет видео со звуком не выйдет? :(
Комментарий от ShurGent — Май 28, 2009 @ 4:41 пп
Можно транслировать полностью всё видео с звуком в реальном времени.
Смотри в сторону mplayer.
Комментарий от itbg — Май 28, 2009 @ 5:58 пп
Та в том-то и дело, что все не надо.
Мне надо транслировать видео со звуком и записывать в файл по детектору движения.
Программ куча для видеонаблюдения, но ни одна не поддерживает запись звука :(
Так не хочется на винде это организовывать, она ж тормозит просто жуть :(
Комментарий от ShurGent — Май 28, 2009 @ 8:08 пп
Motion умеет выполнять скрипт при обнаружении движения.
А что если выключить запись видео средствами motion и написать скрипт, который будет запускать mplayer , который будет писать видео со звуком (пример скрипта записи я уже публиковал)
Остаётся момент, как остановить запись.
Может motion умеет скрипты выполнять и при отсутствии движения.
Это можно уточнить в документации.
Комментарий от itbg — Май 28, 2009 @ 8:37 пп
Вот… а это уже интересно. Скрипт при движении – это хорошее начало.
Надо копнуть в этом направлении…
Спасибо.
Комментарий от ShurGent — Май 28, 2009 @ 8:50 пп
Да, это вполне реально.
Motion может запускать скрипт при начале события (on_event_start) и при окончании события (on_event_end).
Т.е. в скрипте, прописанном в on_event_start можно запускать запись видеопотока в файл. Но тут возникает вопрос, а как из скрипта, который будет запускаться по on_event_end, остановить процесс записи, запущенный скриптом on_event_start?
Можно как-то программно остановить захват mencoder или ffmpeg?
Комментарий от ShurGent — Май 30, 2009 @ 3:42 пп
Все, работает! :)
По событию on_event_end я делаю killall -s SIGQUIT ffmpeg и всё прекрасно работает!
Чудесная система видеонаблюдения со звуком! ;)
Осталось придумать, как сделать цикличность видеоархива (чтобы при заполнении диска самые старые видеофайлы удалялись).
Комментарий от ShurGent — Май 30, 2009 @ 6:28 пп
Интересно!
А как Ты контролируешь время записи?
Ну что-бы по истечению времени запись прервать и снова запустить motion для детекта.
Я кстати контролирую количество видео просто.
Вставил в cron скрипт, который видео старше 30-ти дней удаляет.
Комментарий от itbg — Май 30, 2009 @ 6:43 пп
Пожалуйста поясните, что запускается по событию on_event_start.
Комментарий от leva — Ноябрь 27, 2009 @ 9:35 дп
>А как Ты контролируешь время записи?
А я его и не контроллирую. Motion при движении в кадре генерирует событие on_event_start. При отсутствии движения он «ждет» время, указанное в параметре gap, и если за это время движения не было, то генерируется конец события, т.е. запускается скрипт on_event_end, в котором я останавливаю запись. Когда в кадре появляется новое движение, снова генерируется событие on_event_start и запускается запись нового ролика.
Все отлично работает. Есть движение – пишем, нет движения – не пишем. Все как и должно быть.
Единственное, я не заморачивался насчет нарезки больших роликов на мелкие куски, но мне это и не надо.
>Я кстати контролирую количество видео просто.
>Вставил в cron скрипт, который видео старше 30-ти дней удаляет.
Это ИМХО не совсем корректно. Это нерациональное использование жесткого диска. При таком подходе много свободного места будет «гулять». Правильнее по cron-у раз в день запускать скрипт, который будет проверять кол-во свободного места и при достижении определенного порога начинать удалять самые старые ролики.
Если, например, в среднем за сутки выходит около 2Гб записи, то настроить «ротатор» так, чтобы при <3Гб свободного места начинать удалять самые старые файлы до достижения 6Гб свободного места. Так ИМХО эффективнее.
Комментарий от ShurGent — Июнь 1, 2009 @ 11:54 дп
Всё, сделал цикличность архива!
Написал скрипт, поставил его в on_event_end.
Скрипт останавливает запись, после чего проверяет процент использованного дискового пространства раздела видеоархива. Если значение достигло установленного порога, начинает удалять самые старые файлы в хронологическом порядке, пока не будет достигнуто целевое значение.
Т.е. устанавливаешь порог срабатывания на 98% и целевое значение на 97% и спишь спокойно. Как только занятое на диске место после очередного события достигнет 98% скрипт удалит один или несколько старых файлов, пока занятое место не будет 97%.
Если интересно, могу выложить.
Комментарий от ShurGent — Июнь 4, 2009 @ 8:45 пп
Молодец!
Сделал нужную вещь.
Выложи конечно, интересно посмотреть на реализацию.
Комментарий от itbg — Июнь 5, 2009 @ 2:00 дп
По просьбам трудящихся :)
#!/bin/bash ################################################################## # Скрипт события on_event_end программы motion # # Автор: Долгов Александр aka ShurGent (c) 2009 # #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::# # - Останавливает запись события. # # - Определяет процент свободного места на разделе видеоархива # # и при достижении установленного порога начинает удалять старые # # файлы архива, пока процент свободного места не достигнет # # установленного значения # ################################################################## # ---=== Настройки ===--- # Имя программы, которой производится запись события для её # остановки RECPROG='ffmpeg' # Точка монтирования видеоархива (для команды df) ARCHDEV='/dvr' # Папка, в которой производить очистку диска (папка видеоархива) ARCHDIR='/dvr/video' # Верхний порог занятого места, при котором будет выполняться # удаление старых файлов (в процентах) # Например: 98 HISPACE=98 # Целевой объем занимаемого дискового пространства, до которого # будет производиться очистка (в процентах, должен быть меньше # HISPACE # Например: 97 TARGETSPACE=97 # Тэг логгера TG='MOTION DVR' ################################################################# # Функция остановки записи # Посылает сигнал SIGQUIT указанному в RECPROG процессу function stoprec() { logger -t "$TG" "Stopping event recording..." killall -s SIGQUIT $RECPROG 2>&1 | logger -t "$TG" logger -t "$TG" "Stopped" } # Функция определения использованого архивом дискового пространства # Записывает полученное значение в переменную $freesp function getfree() { logger -t "$TG" "Checking used disk space..." freesp=$(df -HlP | grep -E $ARCHDEV$ | awk '{print $5}' | cut -d'%' -f1) logger -t "$TG" "$freesp% is used" } # Функция удаления самого старого файла из папки видеоархива function dellast() { logger -t "$TG" "Searching oldest file to delete..." file=$(ls -1tR $ARCHDIR | tail -1) isdir=$(echo $file | grep "^/.*:$") if [ -z "$isdir" ] ; then # Файл logger -t "$TG" "File: $file" filetodel=$(find $ARCHDIR -name "$file" | tail -1) logger -t "$TG" "Deleting file $filetodel..." rm -v "$filetodel" 2>&1 | logger -t "$TG" else # Пустая папка filetodel=$(echo $file | cut -d':' -f1) logger -t "$TG" "Deleting empty dir $filetodel..." rm -vr "$filetodel" 2>&1 | logger -t "$TG" dellast fi } # Функция очистки свободного места до установленного порога # Если использованное место больше целевого ($TARGETSPACE), # то удаляет самый старый файл архива и повторяет процедуру # пока не будет достигнуто целевое значение использованного # дискового пространства function freespace() { logger -t "$TG" "Deleting old archive files to reach $TARGETSPACE% of disk space usage:" while [ $freesp -gt $TARGETSPACE ] ; do dellast getfree done } logger -t "$TG" "*** ON_EVENT_END raised *******************" # Останавливаем запись stoprec # Определяем занимаемый архивом объем getfree # Проверяем не достигнут ли порог if [ $freesp -ge $HISPACE ] ; then # Порог достигнут - запускаем очистку logger -t "$TG" "! Used disk space treshold reached" freespace else # Порог не достигнут - завершаем обработку события logger -t "$TG" "Used disk space treshold is not reached" fi # Готово logger -t "$TG" "*** Done. *********************************"Комментарий от ShurGent — Июнь 5, 2009 @ 11:24 дп
Зачёт!
Просто нет слов, всё отлично и понятно!
Большое Спасибо.
Комментарий от itbg — Июнь 5, 2009 @ 4:12 пп
Пожалуйста. Всегда рад помочь, если могу.
Комментарий от ShurGent — Июнь 5, 2009 @ 4:49 пп
запускаю скрипт но ничего не выводится в терминале.. или logger -t записывает инфо в файл
Комментарий от _92 — Сентябрь 9, 2009 @ 9:09 пп
logger записывает в /var/log/messages
в терминал нет смысла выводить
Комментарий от ShurGent — Ноябрь 27, 2009 @ 12:52 пп
А какой программой в линуксе и в винде можно посмотреть сразу много камер с серверов motion?
Комментарий от almaz4x32 — Июль 3, 2009 @ 1:32 дп
У motion встроенный web сервер есть, смотреть видео можно через любой браузер.
Комментарий от itbg — Июль 3, 2009 @ 2:02 пп
Надо сделать одно примечание по поводу моего скрипта – он работает ТОЛЬКО С ОДНОЙ КАМЕРОЙ.
Для работы с несколькими камерами скрипт немного сложнее.
Потому, что killall -s SIGQUIT ffmpeg завершает работу ВСЕХ запущенных ffmpeg, что в многокамерной системе неприемлемо.
Да, и в скрипте я позже нашел баг и исправил его.
Нужно строку:
file=$(ls -1tR $ARCHDIR | tail -1)
Заменить на:
file=$(ls -1rR $ARCHDIR | tail -1)
Потому, что сортировка по времени изменения почему-то работает не так, как я ожидал. Поэтому я решил сортировать тупо по имени файла в порядке убывания.
Комментарий от ShurGent — Ноябрь 27, 2009 @ 1:12 пп
В общем внесу ясность во все, что происходит.
В /etc/motion/motion.conf в строках начала и конца события я прописал следующие скрипты:
Вот собственно содержание самих скриптов:
/etc/motion/motion_event_start
/etc/motion/motion_event_end
#!/bin/bash ################################################################## # Скрипт события on_event_end программы motion # # Автор: Долгов Александр aka ShurGent (c) 2009 # #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::# # - Останавливает запись события. # # - Определяет процент свободного места на разделе видеоархива # # и при достижении установленного порога начинает удалять старые # # файлы архива, пока процент свободного места не достигнет # # установленного значения # ################################################################## # ---=== Настройки ===--- # Имя программы, которой производится запись события для её # остановки RECPROG='ffmpeg' # Точка монтирования видеоархива (для команды df) ARCHDEV='/dvr' # Папка, в которой производить очистку диска (папка видеоархива) ARCHDIR='/dvr/video' # Верхний порог занятого места, при котором будет выполняться # удаление старых файлов (в процентах) # Например: 98 HISPACE=98 # Целевой объем занимаемого дискового пространства, до которого # будет производиться очистка (в процентах, должен быть меньше # HISPACE) # Например: 97 TARGETSPACE=97 # Тэг логгера TG='MOTION DVR' ################################################################# # Функция остановки записи # Посылает сигнал SIGQUIT указанному в RECPROG процессу function stoprec() { logger -t "$TG" "Stopping event recording..." killall -s SIGQUIT $RECPROG 2>&1 | logger -t "$TG" logger -t "$TG" "Stopped" } # Функция определения использованого архивом дискового пространства # Записывает полученное значение в переменную $freesp function getfree() { logger -t "$TG" "Checking used disk space..." freesp=$(df -HlP | grep -E $ARCHDEV$ | awk '{print $5}' | cut -d'%' -f1) logger -t "$TG" "$freesp% is used" } # Функция удаления самого старого файла из папки видеоархива function dellast() { logger -t "$TG" "Searching oldest file to delete..." file=$(ls -1rR $ARCHDIR | tail -1) isdir=$(echo $file | grep "^/.*:$") if [ -z "$isdir" ] ; then # Файл logger -t "$TG" "File: $file" filetodel=$(find $ARCHDIR -name "$file" | head -1) logger -t "$TG" "Deleting file $filetodel..." rm -v "$filetodel" 2>&1 | logger -t "$TG" else # Пустая папка filetodel=$(echo $file | cut -d':' -f1) logger -t "$TG" "Deleting empty dir $filetodel..." rm -vr "$filetodel" 2>&1 | logger -t "$TG" dellast fi } # Функция очистки свободного места до установленного порога # Если использованное место больше целевого ($TARGETSPACE), # то удаляет самый старый файл архива и повторяет процедуру # пока не будет достигнуто целевое значение использованного # дискового пространства function freespace() { logger -t "$TG" "Deleting old archive files to reach $TARGETSPACE% of disk space usage:" while [ $freesp -gt $TARGETSPACE ] ; do dellast getfree done } logger -t "$TG" "*** ON_EVENT_END raised *******************" # Останавливаем запись stoprec # Определяем занимаемый архивом объем getfree # Проверяем не достигнут ли порог if [ $freesp -ge $HISPACE ] ; then # Порог достигнут - запускаем очистку logger -t "$TG" "! Used disk space treshold reached" freespace else # Порог не достигнут - завершаем обработку события logger -t "$TG" "Used disk space treshold ($HISPACE%) is not reached" fi # Готово logger -t "$TG" "*** Done. *********************************"Система работает как часы уже несколько месяцев.
Комментарий от ShurGent — Ноябрь 27, 2009 @ 1:41 пп
Это переводится как события на старт.
Иными словами туда нужно вписать путь к скрипту, который будет выполнятся при обнаружении движения.
Подробнее об этом можно почитать в документации к Motion.
Комментарий от itbg — Ноябрь 27, 2009 @ 9:40 дп
Это понятно. Не понятна конкретная реализация. Еcли я туда помещу скрипт, ну скажем с запуском vlc или mencoder’а – в нем будет присутствовать устройство /dev/video0 – но ведь оно уже занято motion’ом – выходит ошибка :-(
Комментарий от leva — Ноябрь 27, 2009 @ 11:36 дп
Хотя вот сообщение уважаемого Долгова Александра aka ShurGent:
********************************
Все, работает! :)
По событию on_event_end я делаю killall -s SIGQUIT ffmpeg и всё прекрасно работает!
Чудесная система видеонаблюдения со звуком! ;)
********************************
Не могу реализовать событие on_event_start :-(
Комментарий от leva — Ноябрь 27, 2009 @ 12:51 пп
Надо использовать vloopback pipes
Комментарий от ShurGent — Ноябрь 27, 2009 @ 12:54 пп
В смысле «не могу»?
Не нашел где или не срабатывает?
Комментарий от ShurGent — Ноябрь 27, 2009 @ 12:55 пп
Хотя вот сообщение уважаемого Долгова Александра aka ShurGent:
********************************
Все, работает! :)
По событию on_event_end я делаю killall -s SIGQUIT ffmpeg и всё прекрасно работает!
Чудесная система видеонаблюдения со звуком! ;)
********************************
Не могу реализовать событие on_event_start :-(
Это скрипт для on_event_END, т.е. для ОКОНЧАНИЯ события, а не для старта.
Для старта записи я использую:
Комментарий от ShurGent — Ноябрь 27, 2009 @ 1:18 пп
Спасибо за скрипт!
Несколько воросов.
Вы писали:
«Мне надо транслировать видео со звуком и записывать в файл по детектору движения.»
1) /dev/video2 – Ваше устройство за которое зацепилась веб-камера, с которой работает motion или у Вас одна камера для motion (ipeg+avi_без_звука) и вторая для трансляции со звуком?
2) а куда транслируется видео? с какого IP:port’а и чем оно читается?
Комментарий от leva — Ноябрь 27, 2009 @ 4:03 пп
1) Это vloopback девайс. Motion может дублировать картинку в другое устройство с помощью vloopback pipe. С /dev/video0 не получится делать захват, поскольку он занят самой Motion.
2) У меня видео никуда не транслируется (нет у меня такой нужды). У меня производится только запись в avi файл. Видео берется с /dev/video2, звук берется со звуковухи (устройство oss).
Комментарий от ShurGent — Ноябрь 27, 2009 @ 6:18 пп
——————-
Это vloopback девайс. Motion может дублировать картинку в другое устройство с помощью vloopback pipe. С /dev/video0 не получится делать захват, поскольку он занят самой Motion.
——————-
ну вот – Вы меня успокоили – теперь понятно куда копать!
Спасибо!
Комментарий от leva — Ноябрь 27, 2009 @ 7:51 пп
Все работает…
Но… После обработки ffmpeg’ом у avi’шки появляется звук, а картинка – то зелень, то квадратики, то черно-белая… ;-(
Если без обработки – картинка идеальная.
Комментарий от leva — Ноябрь 28, 2009 @ 7:22 пп
Странно… У меня таких проблем не было ни разу.
А что за проц на компе? Может проц не тянет сжатие в mpeg4 на лету?
Комментарий от ShurGent — Ноябрь 28, 2009 @ 7:35 пп
Linux 2.6.27.7-smp #2 SMP Thu Nov 20 22:32:43 CST 2008 i686 Intel(R) Pentium(R) Dual CPU E2220 @ 2.40GHz GenuineIntel GNU/Linux
Буду разбираться с ffmpeg’ом… О результатах обязательно отпишусь.
Спасибо ;-)
Комментарий от leva — Ноябрь 29, 2009 @ 8:59 дп
чем дальше – тем страньше и страньше :-0
если смотреть свойства avi’шек через конкверор – аудиокодек в «ПЛОХОЙ» картинке ЕСТЬ. Логично – в том смысле, что он ЕСТЬ. ffmpeg -i qqq.avi – тоже показывает,что stream audio ЕСТЬ.
хорошо – берем avi’шку и mp’шку и склеиваем:
ffmpeg \
-i qqq.avi \
-i qqq.mp3 -vcodec mpeg4 -acodec libmp3lame \
-y new1.avi
получаем отличную картинку + звук.
смотрим в конкверере – Боже милосердный – аудиокодека НЕТ…Смотрим через ffmpeg – ЕСТЬ!
И звук есть! Вообщем, как сказано: вы думаете суслика нет? а он ЕСТЬ!
отлегло – но стало совсем не понятно… пойду помолюсь Патрику, ибо сказано: нет бога кроме Патрика, и линукса кроме Slackware… аминь…
ЗЫ.молитвы не помогли ;-(
Комментарий от leva — Ноябрь 29, 2009 @ 4:34 пп
Даже не знаю, чем помочь… :(
Я просто склеиванием не занимался и не знаю нюансов.
У меня сразу захват со звуком происходит без всяких промежуточных файлов.
Комментарий от ShurGent — Ноябрь 30, 2009 @ 1:15 пп
———————-
У меня сразу захват со звуком происходит без всяких промежуточных файлов.
———————-
вчера ближе к ночи меня посетила эта мысль – делать через промежуточные файлы…
а сегодня я все-таки добился приемлемой картинки + звук… как сказала жена моего брата, томно глядя на моего брата:»не то что хотелось бы – но не так уж и плохо».
прежде всего уменьшил разрешение: 320×140; ffmpeg_bps – убрал и ниже: ffmpeg_variable_birrate=2; и самое главное – закоментарил motion_video_pipe, а video_pipe = ‘-’
проблемы, с видео у меня и моей Slackware 12.2 (ядро 2.6.27.7) конечно есть – вебка zc0303, а может и нет (zc0301) – проблемма для владельцев этого «чуда» известная именно в разрезе указанного ядра (27)…
но! система заработала… вообщем, как говорила моя знакомая белла куприневич:-»никаких эмоций – одни поллюции»
Спасибо за помощь ;-)
ps. бог даст – на этой неделе попробую под мопсом – отпишусь…
Комментарий от leva — Ноябрь 30, 2009 @ 10:32 пп