Zoneminder - конвертирование видео

Материал из support.qbpro.ru
Версия от 16:29, 22 октября 2021; imported>Vix (Новая страница: «Поиск и копирование всех файлов изменившихся с %date%,<br> Переименование картинок нужный фо...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

Поиск и копирование всех файлов изменившихся с %date%,
Переименование картинок нужный формат
Кодирование видео-файла на основе найденных картинок.

Слабыми и неуклюжими местами показалась отсутствие гибкости в выборе временных диапазонов, точнее ограничения в них команды find.
Ну и ненужное копированиие и переименование в два этапа.
Да и зачем пользоваться find, если пути известны, а данные о файлах с картинками лежат в базе MySQL, а она очень приятно (вкупе с awk) работает в консоли.
Короче родилось вот такое решение:

~/bin/mkvideo:
#!/bin/bash
# камера по-умолчанию, если запущен без параметров
cam_default=Office1
#дата по-умолчанию - вчера
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=/var/cache/zoneminder/events/${cam}
# Где хранить картинки (временно)
jpgpath=~/jpg
# Куда складывать видеофайлы
videopath=~/video
mydate=`date -d "${workdate}" +%Y-%m-%d`
filename=${cam}-${mydate}.avi
zmdatabase=zm
echo workdate is ${mydate}
mkdir -p ${jpgpath} 2>/dev/null
mkdir -p ${videopath} 2>/dev/null
# Выборка нужных файлов из базы данных
# по вкусу (если есть пароль) подкрутить парамерты mysql -u user --password=password
files=`mysql ${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

Качество сжатия и фпс ессно подкрутить по вкусу. Запускать с параметрами

$ ./mkvideo date cam

дата может быть today, yesterday, 2010-12-01 название камеры с учетом регистра как задано в ZoneMinder Если камера одна, прописать ей по-умолчанию в начале скрипта и в крон пихать без параметров сразу после 00:00 по местному времени, будет создаваться видеофайл всех событий за вчерашний день. Путем изменения запроса к MySQL можно легко собирать видео за определенный час, неделю, месяц (это правда долго)