Часть названия

пятница, 11 мая 2012 г.

ZoneMinder 1.25.0 и создание суточных видео.

Столкнулся я тут на работе с замечательной проблемой.

Есть система видеонаблюдения на основе ZM 1.25.0. И надо создать архив видео за сутки. Но вот незадача ZM пишет только 10 минутные видео. Порывшись в интернете понял что ничего свежего и рабочего на эту тему нет. Печаль... Но сего поста бы не было если бы небыло решения :)
Итак, все оказалось не так уж и сложно, результатом моих мучений стал скриптик который сшивает 10 минутные видео за день, кладет их куда надо, чистит за собой хвосты и удаляет видео старше срока хранения. Ну и отчитывается в лог.

#!/bin/bash
starttime=$(date +%F_%T)
#Параметры даты и камеры считываются из командной строки
workdate=$1
cam=$2
#
##ПАРАМЕТРЫ_СКРИПТА
#Директория логов
logpath="LOG_PATH"
# путь до эвентов ZM
evpath="ZM_EVENT_PATH"
# Директория для временных файлов
tmppath="TMP_PATH"
# Куда складывать готовые видеофайлы
videopath="VIDEO_ARCHIVE_PATH"
#База данных ZM
zmdatabase="DATABASE_NAME"
zmuser="DATABASE_USER"
zmpass="DATABASE_PASSWORD"
#Время хранения видеозаписей
savetime="HOW_LONG"
#
##СКРИПТ
#проверим указали ли камеру и дату
if [ -z "$1" ]; then
       echo "Укажите Дату для создания записи"
       exit 1
fi
if [ -z "$2" ]; then
       echo "Укажите Камеру для создания записи"
       exit 1
fi
#раздерем дату на составляющие, это нам понадобится
diry=$(date -d "${workdate}" +%y)
dirm=$(date -d "${workdate}" +%m)
dird=$(date -d "${workdate}" +%d)
#Задание имени готового видеофайла
mydate=$(date -d "${workdate}" +%Y-%m-%d)
filename=${cam}-${mydate}.avi
#Создаем директорию логов если нет
mkdir -p ${logpath}
#Говорим с чем работаем
echo Дата создания записи: ${mydate} >> ${logpath}/${cam}.log
echo Камера: ${cam} >> ${logpath}/${cam}.log
#создание директорий если их нет
mkdir -p ${tmppath}
mkdir -p ${videopath}
# Выборка нужных файлов из базы данных с проверкой на ненулевой размер и копированием во временную директорию
monid=`mysql -u ${zmuser} --password=${zmpass} ${zmdatabase} -s -e "select Id from Monitors where Name='${cam}';" | awk '{print($1);}'`
evid=`mysql -u ${zmuser} --password=${zmpass} ${zmdatabase} -s -e "select Id from Events where MonitorId='${monid}' order by Id;" |awk '{print($1);}'`
i=10000
for n in ${evid}
do
  if [ -s ${evpath}/${diry}/${dirm}/${dird}/.${n}/Event-${n}-r1-s1.avi ]; then
    i=$((i+1))
    ln ${evpath}/${diry}/${dirm}/${dird}/.${n}/Event-${n}-r1-s1.avi ${tmppath}/${i}.avi
  fi
done
#удаление файла с таким же именем как у создаваемого если такой существует
if [ -e "${videopath}/${filename}" ]; then  rm -f ${videopath}/${filename}
fi#кодирование видео из коротких файлов
let "i = i - 10000"
echo Файлов для сращивания: $i  >> ${logpath}/${cam}.log
echo Эталонное количество файлов: 144 >> ${logpath}/${cam}.log
mencoder -ovc copy -o ${videopath}/${filename} ${tmppath}/*.avi
if [ -e "${videopath}/${filename}" ]; then
  echo Создан файл: ${filename} >> ${logpath}/${cam}.log
else
  echo !Ошибка создания файла! >> ${logpath}/${cam}.log
fi
#удаление временных файлов
rm -rf ${tmppath}
#удаление старых файлов
deldate=$(date -d "-${savetime}" +%Y-%m-%d)
delfile="${videopath}/${cam}-${deldate}.avi"
if [ -e "${delfile}" ]; then
  echo Удален старый файл за дату: $deldate  >> ${logpath}/${cam}.log
  rm -f ${delfile}
fi
endtime=$(date +%F_%T)
echo Начало выполнения: $starttime  >> ${logpath}/${cam}.log
echo Конец выполнения: $endtime  >> ${logpath}/${cam}.log
echo "-------------------------------------" >> ${logpath}/${cam}.log
exit 1


Вот так. Справедливую критику принимаю. Пользуйтесь если кому нужно... 

5 комментариев:

ShareThis