Среднее время на прочтение: 2 мин.

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 Задание выполнено !

 

На выходе мы получаем структурированную иерархию папок по датам и видео файлами за прошедшие сутки в них.

Обсуждение

11 комментариев
  • А что за ось такая: Ubuntu Server 1.29.0 LTS

    • Это ответ на комментарий Konchik

      Такой оси нет, опечатка произошла! 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?

    • Это ответ на комментарий Artem

      Не, тогда -mtime -1, так правильней будет. А -mmin -60, это видимо я что то проверял и такой листинг выложил, сейчас поправлю.