LINUX.ORG.RU

Создание видео из файлов zoneminder


0

1

Есть идея создавать из записаных zoneminder эвентов суточное видео... Нагуглил я такой вот скрипт:

#!/bin/bash
# камера по-умолчанию, если запущен без параметров
cam_default=Vhod
#дата по-умолчанию - вчера
workdate_default=`date -d yesterday`
workdate=$1
cam=$2
if [ "Z"$1 = "Z" ]; then
       workdate=$workdate_default
fi
if [ "Z"$2 = "Z" ]; then
       cam=$cam_default
fi
# путь до ZM
inpath=/video/${cam}
# Где хранить картинки (временно)
jpgpath=~/jpg
# Куда складывать видеофайлы
videopath=/video/Arch-Days
mydate=`date -d "${workdate}" +%Y-%m-%d`
filename=${cam}-${mydate}.avi
zmdatabase=zm
echo workdate is ${mydate}
echo camera is ${cam}
mkdir -p ${jpgpath} 2>/dev/null
mkdir -p ${videopath} 2>/dev/null
# Выборка нужных файлов из базы данных
# по вкусу (если есть пароль) подкрутить парамерты mysql -u user --password=password
files=`mysql -u USER_NAME --password=USER_PASSWORD ${zmdatabase} -s -e "select eventid,right(concat('00',frameid),3) from Frames where date(timestamp)='${mydate}' order by eventid,frameid;" | awk '{print($1"/"$2"-capture.jpg");}'`
i=0
for f in ${files}
do
    # проверка на размер файла, ZM иногда пишет картинки с нулевым размером
    # а ffmpeg потом спотыкается
    if [ `ls -l ${inpath}/${f} | awk '{print $5}'` -gt 0 ]; then
       i=$((i+1))
       p=$(printf %.8d $i)
       cp -p  ${inpath}/$f ${jpgpath}/$p.jpg
    fi
done
rm ${videopath}/${filename} 2>/dev/null
# Кодируем видео из картинок
ffmpeg -r 100 -an -i ${jpgpath}/%08d.jpg -vcodec h263p -b 1500k ${videopath}/${filename}
#Удаляем старые файлы
rm ${jpgpath}/*.jpg 2>/dev/null

спотыкается на том что пытается найти файлы картинок эвента в

/video/764/001-capture.jpg

а они лежат в

/video/12/04/13/764/001-capture.jpg

Вопрос как исправить? Ну или мож но ли вывод

date=$(date +%F)

например 2012-04-13 разбить на три переменные 12, 04 и 13 можно конечно сделать:

year=$(date +%Y)
month=$(date +%m)
day=$(date +%d)

но я не знаю как сделать тогда чтобы от $year вместо 2012 оставить только 12

Подскажите пожалуйста.

Ответ на: комментарий от liquidpredator

Окончательный вариант, если кому понадобится:

#!/bin/bash
# камера по-умолчанию, если запущен без параметров
cam_default=DEFAULT_USER_CAM
#дата по-умолчанию - вчера
workdate_default="yesterday"
workdate=$1
cam=$2
if [ "Z"$1 = "Z" ]; then
       workdate=$workdate_default
fi
if [ "Z"$2 = "Z" ]; then
       cam=$cam_default
fi
# путь до ZM
inpath="ZM_EVENTS_PATH/${cam}"
diry=$(date -d "${workdate}" +%y)
dirm=$(date -d "${workdate}" +%m)
dird=$(date -d "${workdate}" +%d)
# Где хранить картинки (временно)
jpgpath="TEMP_JPG_PATH"
# Куда складывать видеофайлы
videopath="VIDEO_PATH"
mydate=$(date -d "${workdate}" +%Y-%m-%d)
filename=${cam}-${mydate}.avi
zmdatabase="DATABASE_NAME"
echo workdate is ${mydate}
echo camera is ${cam}
mkdir -p ${jpgpath} >> /dev/null
mkdir -p ${videopath} >> /dev/null
# Выборка нужных файлов из базы данных
# по вкусу (если есть пароль) подкрутить парамерты mysql -u user --password=password
files=`mysql -u USER_NAME --password=USER_PASSWORD ${zmdatabase} -s -e "select eventid,right(concat('00',frameid),3) from Frames where date(timestamp)='${mydate}' order by eventid,frameid;" | awk '{print($1"/"$2"-capture.jpg");}'`
i=0
for f in ${files}
do
    # проверка на размер файла, ZM иногда пишет картинки с нулевым размером
    # а ffmpeg потом спотыкается
    if [ `ls -l ${inpath}/$diry/$dirm/$dird/.${f} | awk '{print $5}'` -gt 0 ]; then
       i=$((i+1))
       p=$(printf %.8d $i)
       cp -p  ${inpath}/$diry/$dirm/$dird/.$f ${jpgpath}/$p.jpg
    fi
done
rm ${videopath}/${filename} >> /dev/null
# Кодируем видео из картинок
ffmpeg -r 100 -an -i ${jpgpath}/%08d.jpg -vcodec h263p -b 1500k ${videopath}/${filename}
#Удаляем старые файлы
rm ${jpgpath}/*.jpg >> /dev/null

Правда осталась одна маленькая проблема. FFMPEG сконвертил мне просто трех минутный файл с черным экраном... но я подозреваю что у меня просто что-то не так с его настройками :)

liquidpredator
() автор топика
Ответ на: комментарий от liquidpredator

Поправка, не работает так как ZM в таблице Events хранит номера вреймов как с 1 по 10 а дальше 100, 200, 300 и так далее.

Кто-нибудь может помочь?

liquidpredator
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.