Запись RTSP потоков с IP-камер в *.mp4 файлы с датой-временем в имени файла
Здравствуйте, уважаемые форумчане. Прошу помощи по следующему вопросу. У меня есть в локальной сети три IP-камеры и компьютер с Debian.
Вот RTSP-URL-ы к этим камерам:
Нужно на компьютере с Debian организовать что-то вроде видеорегистратора: записать эти RTSP-потоки в *.mp4 файлы, длительностью в 1 час (время настраиваемое) на каждый файл, и разложить их по папкам в таком виде:
где «cam_»-простая приписка, «192_168_0_124_1004» взять из IP-адреса и порта соответственно, «2016»-год, «07»-месяц, «26»-день в которые записан файл.
Туда положить файлы с именами в таком виде:
где «cam_»-простая приписка, «192_168_0_124_1004» взять из IP-адреса и порта соответственно, YYYY-год, MM-месяц, DD-день, HH-часы, MM-минуты, SS-секунды, mmm-миллисекунды (то есть, IP адрес, порт, дата-время создания файла в имени этого файла).
Чтобы шаблоны имен файлов и папок были настраиваемыми. Чтобы можно было также регулировать занимаемое дисковое пространство папкой
Перерыл весь интернет, ничего нормального не нашел. Как это можно сделать?
А zoneminder — не подходит?
zoneminder лютое УГ. пишет всё в картинки.
Флюссоник, который мы разрабатываем в Эрливидео имеет такую фичу (DVR) и она у нас хорошо обкатана: http://erlyvideo.ru/ Но наш софт стоит денег.
А вообще можешь попробовать сделать скрипт, который будет запускать ffmpeg, который будет читать видео с камеры и записывать в mp4.
Соответственно раз в час убивать ffmpeg, и стартовать заново (можно чуть загодя). Побочный эффект — будут пропуски либо наоборот видео внахлёст между двумя часовыми файлами.
Кроме того, ffmpeg может отвалиться (если камера начнёт глючить и давать плохой контент или ещё чего), нужно ещё не забывать поднимать его. Отвалившийся ffmpeg, значит что нужно открыть новый файл и писать заново. Не уверен что ffmpeg умеет дописывать в mp4.
Инструментов для сохранения RTSP потоков немало, но ограничение длительности (сегментацию) скорее всего умеет только FFmpeg (https://www.ffmpeg.org/ffmpeg-formats.html#segment_002c-stream_005fsegment_00. ). Всё остальное решается скриптингом на чём хотите.
Ффмпег, который мы разрабатываем в опенсорсе имеет такую фичу (DVR) и она у нас хорошо обкатана: http://ffmpeg.org/ Но наш софт нужно уметь использовать.
А вообще можешь попробовать сделать скрипт, который будет запускать Флюссоник, который будет читать видео с камеры и записывать в mp4.
Соответственно раз в час убивать Флюссоник, и стартовать заново (можно чуть загодя). Побочный эффект — будут пропуски либо наоборот видео внахлёст между двумя часовыми файлами.
Кроме того, Флюссоник может отвалиться (если камера начнёт глючить и давать плохой контент или ещё чего), нужно ещё не забывать поднимать его. Отвалившийся Флюссоник, значит что нужно открыть новый файл и писать заново. Не уверен что Флюссоник умеет дописывать в mp4.
Запись потока RTSP с уличной камеры в файл
Пытаюсь на коленках организовать запись с наружных камер видеонаблюдения на локальный HDD. Камеры простые, отдают поток RTSP по ссылке вида
В качестве граббера потока выбрал ffmpeg, который (теоретически) должен уметь выполнять конструкцию вида
Поток живой, VLC открывает и показывает с минимальной разумной задержкой (секунда-две). При этом ffmpeg пытается подключиться, пасует на UDP, переключается на TCP но и там отваливается по тайм-ауту со словами «Output file #0 does not contain any stream».
При этом, на этапе записи НЕ стоит задача перекодировки потока. Только захват и запись, остальное, при необходимости, можно будет выполнить позже. Для этого попробовал указать -vcodec copy -acodec copy, но ffmpeg version 3.4.7 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-39) отказался. Говорит: «Unknown decoder ‘copy’».
Планирую загнать под cron и запускать процесс, скажем, каждый час, убив его предшественника с задержкой в несколько секунд, чтобы обеспечить незначительный перехлёст в записи, исключив разрывы.
В общем, прошу помощи: как правильно должна выглядеть строка запуска ffmpeg под мою задачу?
Китайская IP-камера и домашняя система видеонаблюдения на Ubuntu Server.
Домашняя система видеонаблюдения на основе китайской IP-камеры с RTSP потоком и датчиком движения.
пятница, 23 марта 2018 г.
Запись RTSP потока с китайской IP-камеры по датчику движения.
Прикупил я как-то, китайскую IP-Камеру ( Unitoptek Official Store ) на Aliexpress. Давно хотел понаблюдать за курильщиками на лестничной площадке. 
Из нужных мне характеристик:
— Поддержка 720p и 1080p
— Сетевые протоколы: TCP/IP, UDP, RTP, RTSP, RTCP, HTTP, DNS, DDNS, DHCP, FTP, NTP, PPPOE, SMTP и UPNP
— Датчик движения ONVIF
— RTSP URL-адрес для медиапроигрывателя VLC:
rtsp://$(IP):$(PORT)/user=$(USER)&password=$(PWD)&channel=$(Channel)&stream=$(Stream).sdp?real_stream
— Сведения о порте:
ONVIF 2.0, порт 8899; RTSP, порт 554; HTTP, порт 80; медиапорт 34567
Все остальное стандартное как и у всех китайских камер. Кому интересно сходите по ссылке и почитайте про нее.
После получения, как и положено поигрался с ней, повесил в подъезде, и начал думать про систему видеонаблюдения.
Для себя решил, что все буду делать на Ubuntu Server. Кроме системы наблюдения, его можно использовать как хранилище файлов, фильмов ну и т.д. и т.п. А рулить им можно с любого домашнего компа по SSH.
Почитал форумы, перепробовал все что предлагается из бесплатного. Все не то. Но наткнулся на интересную тему в форуме: Motion + ffmpeg + rtsp с IP-камеры без перекодирования.
Вот то, что мне нужно! Идея задействовать детектор движения камеры, а видео писать командой openRTSP, мне очень понравилась. Тут все должно быть очень просто! Минимум настроек. Можно уложиться в 20. 30 строчек кода.
Но так как продолжения темы нет — решил сам накидать программку.
И так начнем!
— НАСТРОИМ КАМЕРУ —
— Настройка камеры идет через NETSurveillance WEB и только в Internet Explorer. Он установится при первом заходе по IP адресу камеры (в моем случае это 192.168.20.45).
При установке NETSurveillance WEB руганулся антивирус (у меня стоит ESET NOD32). На время установки пришлось его отключить. 
Пароль на вход по умолчанию пустой:
В дальнейшем поменяйте его обязательно! В настройках камеры это можно сделать.
Далее находим и включаем датчик движения: 
Заходим в сетевые службы и настраиваем Тревожный сервер: 

Не забудем зайти в менеджер конфигураций и настроить Тип сигнала -> Движение -> Вкл. 
— Настраиваем тревожный сервер на камере:
IP: 192.168.20.75
порт: 2345
По движению в кадре будет отправляется тревожный сигнал на наш сервер.
По желанию можно настроить компрессию камеры. На этом останавливаться не буду. Для себя выбрал 720P (1024×720). Битрейт видеопотока поменьше, а качество меня и такое устроило. — ДЕЛАЕМ СВОЙ СЕРВЕР —
— Для эксперимента нашел старую материнку ASRock G31M-S. Процессор — Intel(R) Celeron(R) CPU 430 @ 1.80GHz. Оперативки 2 Гига.
Поставил сервер на Ubuntu 14.04.5 LTS. Работает в этой же сети IP сервера — 192.168.20.75!
Сделал ssh доступ по 22 порту. Работать будем из консоли. Монитор больше не нужен будет. Я хочу сервер запрятать и забыть про него.
Что нужно для нашей задачи?
— Скрипт который постоянно слушает порт: 2345. Если с камеры поступил тревожный сигнал, командой openRTSP пишем поток в файл.
— Не забудьте установить openRTSP на сервер!
Пролистал темы по сокетам. В итоге набрел на хорошее решение: сервер-демон на языке perl прослушивающий tcp сокет. Очень все подробно описывается и работает на ура.
Взял за основу этот скрипт и немного допилил под свои нужды. В итоге получаем:
На сервере скрипт socket_server.pl запущенный демоном слушает порт 2345.
Как только камера стукнула ему, что есть движение, он запускает еще один перловский скрипт: write_video_file.pl — который пишет видео длительность 30 секунд. Если движение в кадре еще продолжается, пишется второй кусок 30 секундного видео.
Особенность этого скрипта в том, что он использует модуль File::Flock::Tiny ( Использование pid-файлов для предотвращения повторного запуска скрипта. ) Зачем я использовал этот модуль? А вот для чего: с камеры идет не один сигнал тревоги, а целая пачка. У меня было до десяти сигналов за 3-4 секунды. socket_server запускал до 10 параллельных потоков записи видео. А модуль File::Flock::Tiny эту проблему как раз и исправил!
Ну все! Тестил пару дней. Все работает. Глюков пока не словил. Меня пока полностью удовлетворяет.
— САМИ СКРИПТЫ —
socket_server.pl
Вполне возможно, что для работы этих скриптов понадобится добавить модуль для перла.
Для установки необходимых модулей:
cpan install File::Flock::Tiny
Если не получилось, то воспользуемся еще одним методом:
sudo apt-get install build-essential
дальше ставим сам модуль:
sudo perl -MCPAN -e ‘install File::Flock::Tiny’
— ПРОВЕРКА РАБОТЫ —
Запустим сервер:
./socket-server.pl
Если не руганулся, то все нормально. Для проверки введите следующую команду:
netstat -plutn
в листинге можно увидеть что-то подобное:
tcp 0 0 192.168.20.75:2345 0.0.0.0:* LISTEN 1201/perl 
Дополнительно проверить можно так:
nc -v 192.168.20.75 2345
В ответ получим:
Connection to 192.168.20.75 2345 port [tcp/*] succeeded!
Все. Сервер работает!



