Регистратор на Bash для камер с rtsp

в 14:29, , рубрики: bash-скрипт, ip-камера, linux, rtsp, китай, Работа с видео

Всем привет!

Так как ребенок уже в том возрасте, когда уходит в школу и приходит из нее самостоятельно, при этом имеет ломаный график обучения, стала задача мониторинга, как он делает уроки, сколько времени занимается фортепиано и прочих задач воспитания.

Но денег не особо много, чтобы покупать какие-то специализированные решения, поэтому решено было поскрести по завалам хлама в серверной и с разрешения руководства утащить домой IP-камеру Xblitz iSee P2P IP WiFi.

image

Камера Xblitz iSee P2P IP WiFi

В камере была заявлена поддержка ONVIF, что автоматически наталкивало на мысль, что нужно ставить ZoneMinder и управлять устройством через него.

Установил, но, как оказалось, эта камера ни при каких настройках не хотела работать с ним.
В веб-интерфейсе камеры выяснилось, что изготовителем камеры до брендирования для польского рынка является китайский производитель netcam360.

Веб-интерфейс камеры

image

После определения настоящего производителя, через поисковик, выяснилось, что не только я имею проблемы с вышеуказанным форматом. И не только мне не удалось настроить на работу с указанным протоколом. Видимо, включение ONVIF в интерфейсе — это ни что иное как шутка от программистов из Китая.

Включение ONVIF в интерфейсе

image

Было решено, что захватывать буду через RTSP. Благо, этот метод работал.
Но, так как я заинтересовался темой написания сервиса в systemd, определил сделать не простой bash-скрипт для захвата потока, а такой себе сервис.

Как оказалось, написание сервиса очень простая процедура. Вот код незамысловатого сервиса под названием «camera@.service», который размещен в /etc/systemd/system

Сервис «сamera»

[Unit]
Description=Camera Service on %I
After=network.target

[Service]
Type=simple
KillSignal=HUP
User=camera
SyslogIdentifier=camera_%i
ExecStart=/bin/bash -a -c '</dev/tcp/%i/10554 && source /etc/camera.conf && mkdir -p /home/camera/%i && cd /home/cam
era/%i && exec /usr/bin/openRTSP -D 5 -F $DATE -K -4 -P 3600 -l -b 200000 rtsp://%i:10554/udp/av0_0'
Restart=always
RestartSec=10
#Restart=on-failure

[Install]
WantedBy=multi-user.target

Как видно, сервис запускается командой «systemctl start camera@IP-address».
В /etc/camera.conf всего лишь одна строчка, сделано было для того, чтобы соответствовать канонам Linux-сервиса

Содержание конфигурационного файла

DATE=$(date "+%Y_%m_%d_%H_%M_%S")

Для удобства прописал в /etc/hosts на этот IP имя «eye01».
Предполагается, что камер в дальнейшем может быть три.

Осталось только в cron добавить удаление устаревших файлов, так как один час записи — это файл примерно 1,5 ГБ.

find /home/camera/eye01 -mtime +2 -delete

И можно спокойно мониторить.

Но, через несколько дней я выяснил, что камера иногда перестает отвечать и видео прерывается.

Пришлось еще запланировать в cron проверку камеры с помощью скрипта, информирование об этом в slack и рестарт камеры. Опытным путем определил, что зависать она может один раз в 10-12 часов. Поэтому планировщик проверяет пишет ли камера один раз в полчаса. Потеря получаса записи для меня не критична.

Скрипт проверки камеры

#!/bin/bash -e
exec 1> >(logger -s -t "$(basename $0) $1") 2>&1
SIZE1=$(du -sb /home/camera/$1 | cut -f1)
sleep 5
SIZE2=$(du -sb /home/camera/$1 | cut -f1)

if [ $SIZE1 -eq $SIZE2 ]
then
    echo "Size of $1 is not increasing, probably not recording"
    if [ ! -f /tmp/$1 ]
        then
        touch /tmp/$1
        /usr/local/bin/slackcat -n beholder "Size of $1 is not increasing, probably not recording. Rebooting."
        /usr/local/bin/reboot_camera.sh $1
        fi
    exit 1
else
    echo "Size of $1 is increasing, probably recording"
    if [ -f /tmp/$1 ]
        then
        rm -f /tmp/$1
        /usr/local/bin/slackcat -n beholder "Size of $1 is increasing, probably recording"
        fi
    exit 0
fi

Скрипт перезапуска камеры

#!/bin/bash
exec 1> >(logger -s -t "$(basename $0) $1") 2>&1
if [ "$1" == "eye01" ]; then
    curl "http://$1/reboot.cgi?loginuse=admin&loginpas=PASSWORD"
elif [ "$1" == "eye02" ]; then
    curl "http://$1/reboot.cgi?loginuse=admin&loginpas=PASSWORD"
elif [ "$1" == "eye03" ]; then
    curl "http://$1/reboot.cgi?loginuse=admin&loginpas=PASSWORD"
else
    echo "Not recognized camera $1"
    exit 1
fi

Собственно все. Надеюсь кому-то еще мое решение поможет быстро и недорого организовать видеонаблюдение.

Буду благодарен любой критике и предложениям по его усовершествованию.

Ссылки и использованные публикации

Репозиторий
Интеграция Slack с помощью slackcat
Как написать сервис systemd

Спасибо за внимание.

Автор: lex-tsy

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js