В продолжение темы ip-камер, хочу поделиться способом сборка видеологов с камеры.
Сбор будет производится связкой python + bash, python здесь выступает в качестве поставщика видео-потока, а bash — все остальное.
Суть алгоритма — снимая данные с встроенного в ip-камеру детектора движения при его наличии начать запись видео в формате h264 с помощью ffmpeg в файл с именем в формате YYYY-MM-DD/HH-MM-SS. Длительность записи выбрана произвольно, 360 секунд.
Ниже представлен bash-скрипт с небольшими комментариями, реализующий все вышеописанное, а так-же способ его периодического выполнения средствами systemd.
#!/bin/bash # здесь делаем проверку, не запущен ли уже экземпляр скрипта # фактически, что запись ещё не ведётся, если чесно, то # этот код здесь ненужен, так-как фактически systemd таймер # будет запускать скрипт по истечении 5 сек после завершения # его запущенного до этого экземпляра. PID=/run/lock/ipcam.run pgrep -F $PID >/dev/null 2>&1 && exit echo $ > $PID DIR=/home/ipcam/video # следующая команда получает данные с датчика движения камеры, # в вашем случае url может быть другим в значение # Authorization: Basic содержится пара login:password # кодированная в формат base64 # для получения своей строки достаточно выполнить # echo mylogin:mypassw | base64 M=$(curl -s -H 'Authorization: Basic bG9naW46cGFzc3dvcmQK' http://myipcam.domain/NetSDK/Video/motionDetection/channel/1/status) # ответом должна быть строка, с содержимым либо true, либо false if [ "$M" == 'true' ]; then SUBDIR=$(date "+%Y-%m-%d") FILE=$(date "+%H_%M_%S_%N") mkdir -p "${DIR}/${SUBDIR}" # здесь в течении 360 секунд пишем видео во временный файл timeout 360 ~/bin/ipcam.py 2>/dev/null | ffmpeg -loglevel error -i - -f h264 -nostdin "${DIR}/${SUBDIR}/${FILE}.mp4~" 2>> "${DIR}/${SUBDIR}.log" # после чего, приводим его в человеческий вид ffmpeg -loglevel error -i "${DIR}/${SUBDIR}/${FILE}.mp4~" -c copy "${DIR}/${SUBDIR}/${FILE}.mp4" rm "${DIR}/${SUBDIR}/${FILE}.mp4~" fi
Добавляем нового пользователя, предполагая, что вышеприведённый скрипт будет размещён в папке /home/ipcam/bin/, в ней-же должен уже лежать файл ipcam.py, речь о котором шла в предыдущей статье.
useradd -m ipcam chmod 750 /home/ipcam # далее от имени пользователя ipcam создаём папки bin и video su - ipcam mkdir bin video # WARNING: т.к. в исполняемых файлах содержится логин/пароль, необходимо закрыть их от посторонних глаз chmod 750 bin/*
Создаём юнит systemd, с помощью которого будем запускать наш скрипт
# /etc/systemd/system/ipcam.service
[Unit] Description=LSB: Start Motion detection Before=shutdown.target After=local-fs.target remote-fs.target Conflicts=shutdown.target [Service] ExecStart=/home/ipcam/bin/motion_detect.sh User=ipcam Group=ipcam [Install] WantedBy=multi-user.target
и собственно сам файл-таймер, в котором обозначаем нужную нам периодичность запуска скрипта (5 сек)
# /etc/systemd/system/ipcam.timer
[Unit] Description=Check motion ipcam [Timer] OnUnitInactiveSec=5s AccuracySec=1s
После добавления юнитов делаем reload демону systemd и включаем наш таймер.
systemctl daemon-reload systemctl enable ipcam.service systemctl start ipcam.service
Посмотреть состояние всех таймеров в системе можно командой
systemctl list-timers --all