Cоздание суточного видео по камерам в ZoneMinder
Как известно ZoneMinder хранит Events (События) только в картинках. Поддержки записи сразу в видео нет. Можно конечно выгружать отдельные Events в видео, но делать это массово по нескольким Events нельзя. Так же если у вас режим записи по камерам Motion, то вообще можно утомится выгружать средствами ZoneMinder каждый Event.
Так вот задался я такой задачей как создавать суточное видео по камерам, выгрузки их на файловый ресурс Samba и отправки уведомления об выполнении на почту.
[note]Заметка: У меня ZoneMinder 1.29.0 развернут на Ubuntu Server 14.04 LTS[/note]
Итак выполнять все это мы будем скриптом, так же для скрипта нам понадобится SSMTP (для отправки уведомления на почту, как установить и настроить его можно почитать тут) и кодировать видео мы будем с помощью mencoder.
[note]Подсказка: устанавливаем mencoder из репозитариев Ubuntu:
sudo apt-get install mencoder -y
[/note]
В итоге вот такой скрипт по выгрузке получился. Скрипт с подробными комментариями, поэтому не должно возникнуть вопросов по тому как он работает.
#!/bin/bash # Скрипт для автоматического создания видео файлов за последние 24 часа. # jakondo.ru 2016 #Создаем папку для временных файлов mkdir -p /tmp/alarmvideos # Получаем список имеющихся камер cameraname=(`ls /usr/data/zm/events/ | grep '[a-zA-Z]'`) cameraList=(`ls /usr/data/zm/events/ | grep '[0-9]'`) cameraNum=${#cameraList[@]} eventsFolder=/usr/data/zm/events/ echo Число заведенных в ZoneMinder камер: ${#cameraList[@]} # Начинаем работу над получением списка картинок по каждой камере за последние 24 часа и последующая их сортировка для # правильной склейки видео файла. # Начинаем цикл создания списка картинок по каждой найденной камере в ZM. for (( i=0; i<${cameraNum}; i++ )); do echo Делаю выборку событий по камере: ${cameraname[$i]} # Получаем список картинок за последние 24 часа по каждой найденной камере в ZM. find $eventsFolder${cameraList[$i]} -mtime -1 -name \*capture.jpg > /tmp/alarmvideos/${cameraname[$i]}.list # Сортируем полученный список картинок для корректного создания суточного видео. sort /tmp/alarmvideos/${cameraname[$i]}.list -n -o /tmp/alarmvideos/${cameraname[$i]}-sorted.list # Используем локальное время для точной сортировки. LC_ALL=C sort /tmp/alarmvideos/${cameraname[$i]}.list -d -o /tmp/alarmvideos/${cameraname[$i]}-sorted.list done # Выводим уведомление об успешном создании списков. echo Списки картинок по каждой камере в ZM успешно созданы ! # Начинаем цикл создания видео из полученных списков по каждой камере в ZM. for ((i=0; i<${cameraNum}; i++ )); do echo Создаю суточный видео файл по камере: ${cameraname[$i]} mencoder mf://@/tmp/alarmvideos/${cameraname[$i]}-sorted.list -mf w=640:h=480:fps=5:type=jpg -ovc lavc -lavcopts vcodec=mpeg4 -ofps 5 -oac copy -o /tmp/alarmvideos/${cameraname[$i]}.avi done # Выводим уведомление об успешном создании видео. echo Видео файлы по каждой камере в ZM успешно созданы ! # Выкладываем полученные видео файлы на Samba ресурс, отправляем уведомление на почту об успешном выполнении # и чистим за собой временные файлы. # Создаем каталог (если его не существует) на Samba сервере формата (Год/Месяц/День) mkdir -p /home/admintemp/videos/`date +%Y`/`date +%m`/`date +%d`/ # Ищем полученные видео файлы и перемещаем их на Samba сервер. cd /tmp/alarmvideos find *.avi -size +5k -exec mv {} /home/admintemp/videos/`date +%Y`/`date +%m`/`date +%d` \; # Удаляем отработанные списки картинок по камерам в ZM. rm -rf /tmp/alarmvideos/*.list rm -rf /tmp/alarmvideos/*.avi # Отправляем уведомление на почту об выполнении задания. # Создаем шаблон письма и указываем кому оно адресовано echo "To: jakondo@jakondo.ru" > /home/admintemp/report_zm.msg # Дописываем в созданное письмо тему письма echo "Subject: $(date --date "yesterday") Суточная выгрузка видео по камерам ZM 192.168.1.2" >> /home/admintemp/report_zm.msg # Дописываем в созданное письмо основной тест письма for (( i=0; i<${cameraNum}; i++ )); do echo Выгрузка по камере: ${cameraname[$i]} завершена. >> /home/admintemp/report_zm.msg done echo "" >> /home/admintemp/report_zm.msg # отправляем созданное письмо на указанный адрес /usr/sbin/ssmtp jakondo@jakondo.ru < /home/admintemp/report_zm.msg # Подчищаем за собой, удаляем отработанный шаблон письма rm /home/admintemp/report_zm.msg echo Задание выполнено !
На выходе мы получаем структурированную иерархию папок по датам и видео файлами за прошедшие сутки в них.
А что за ось такая: Ubuntu Server 1.29.0 LTS
Такой оси нет, опечатка произошла! 1.29.0 это версия Zoneminder, а используемая ОС Ubuntu 14.04
Поправил синтаксическую ошибку.. спасибо!
Скрипт не работает вообщем
Выводит ошибку mencoder-script.sh: 8: mencoder-script.sh: Syntax error: «(» unexpected
В какой строке скрипта ошибка ?
cameraname=(`ls /usr/data/zm/events/ | grep ‘[a-zA-Z]’`), скорее всего не нравятся круглые скобки, ставлю либо { либо [, далее при выполнении скрипта вылазит другая ошибка, строка 18, Syntax error: Bad for loop variable
Ошибка Syntax error: «(» unexpected, возникает в строчке 8, cameraname=(`ls /usr/data/zm/events/ | grep ‘[a-zA-Z]’`), видимо ему не нравятся круглые скобки, ставлю [, либо {, далее при запуске вылазит другая ошибка Syntax error: Bad for loop variable, строка 17, ОС Ubuntu Server 18.04, ZoneMinder версии v1.30.4, благодарю за отклик.
Странно, сейчас попробовал скрипт и в частности обработку проблемных у вас строк и все нормально отрабатывает…
Вопрос, а в какой ОС вы выполняете скрипт ?
Ubuntu Server 18.04, ZM v1.30.4
># Получаем список картинок за последние 24 часа по каждой найденной камере в ZM.
> find $eventsFolder${cameraList[$i]} -mmin -60 -name \*capture.jpg > /tmp/alarmvideos/${cameraname[$i]}.list
Может -mmin -1440?
Не, тогда -mtime -1, так правильней будет. А -mmin -60, это видимо я что то проверял и такой листинг выложил, сейчас поправлю.