Столкнулся я тут на работе с замечательной проблемой.
Вот так. Справедливую критику принимаю. Пользуйтесь если кому нужно...
Есть система видеонаблюдения на основе 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
Вот так. Справедливую критику принимаю. Пользуйтесь если кому нужно...















Сохранил в bat запустил под виндой не пашет лажа
ОтветитьУдалитьМетки не читаем? Синтаксис не знаем? #!/bin/bash ничего не говорит?
УдалитьНет. Нет. Нет.
УдалитьНу плохо, что я могу сказать.
Удалитьтолстый-толстый тролль.
Удалить