Вопрос или проблема
Запись RTSP-потока с IP-камеры и его сохранение
У меня есть несколько IP-камер, которые выводят RTSP-поток (h264 mpeg4).
При доступе к URL локально через VLC:
rtsp://192.168.0.21:554/mpeg4
Я могу транслировать камеру и сохранять на диск (на моем рабочем столе). Однако я хотел бы хранить эти файлы на своем NAS (FreeNAS). Я искал способы захватить RTSP-поток и сохранить его на диск, но не смог найти ничего подходящего.
Возможно ли захватить поток на FreeBSD или Linux (RaspberryPi) и сохранить потоковый контент на локальном диске Linux или FreeBSD – желательно каждые 30 минут?
ПРИМЕЧАНИЕ:
NAS безголовый (HP N55L или что-то в этом роде), и RaspberryPi тоже безголовые.
Я уже смотрел на ZoneMinder, но мне нужно что-то более компактное. Я надеялся использовать Motion для обнаружения движения в потоке, но это будет позже.
IP-камеры разных качеств, некоторые ведут себя непредсказуемо, по моему опыту. Работа с их RTSP-потоками требует некоторой степени устойчивости к сбоям.
Проект Live555 предоставляет относительно устойчивую к сбоям реализацию RTSP-клиента openRTSP для получения RTSP аудио/видео потоков через CLI: http://www.live555.com/openRTSP/
Например, чтобы сохранить RTSP аудио/видео с камеры в файлы в формате QuickTime (доступны также AVI и MP4), один файл каждые 15 минут:
$ openRTSP -D 1 -c -B 10000000 -b 10000000 -q -Q -F cam_eight -d 28800 -P 900 -t -u admin 123456 rtsp://192.168.1.108:554/11
Эти параметры означают:
-D 1 # Завершить, если нет пакетов в течение 1 секунды или более
-c # Непрерывная запись после завершения -d в течение времени
-B 10000000 # Входной буфер на 10 МБ
-b 10000000 # Выходной буфер 10 МБ (в файл)
-q # Создавать файлы в формате QuickTime
-Q # Отображать статистику QOS
-F cam_eight # Добавить этот текст в названия выходных файлов
-d 28800 # Запустить openRTSP на это количество секунд
-P 900 # Начать новый выходной файл каждые -P секунд
-t # Запросить завершение стрима камеры по TCP, а не UDP
-u admin 123456 # Имя пользователя и пароль, ожидаемые камерой
rtsp://192.168.1.108:554/11 # RTSP URL камеры
Удаление параметра -t заставляет openRTSP по умолчанию использовать UDP, что может немного снизить сетевой трафик. Вам нужно будет поиграться с параметрами, чтобы найти комбинацию, которая подойдет вам.
Честно говоря, сами камеры иногда ненадежны или просто реализованы иначе – закрытие сокета неожиданно не является чем-то необычным.
Иногда клиент openRTSP не ловит эти сбои. Поэтому я выбрал написать контроллер на Python, используя модуль ‘subprocesses’, чтобы вызывать и отслеживать stdout каждого экземпляра клиента openRTSP, а также проверять, продолжают ли файлы увеличиваться в размере.
Похоже, это побочный продукт нижнего уровня индустрии CCTV, которая небрежно относится к стандартам, RTSP и ONVIF являются двумя наиболее часто нарушаемыми.
К счастью, вы обычно можете обойти эти проблемы. Если ваши IP-камеры и контроллер не разработаны с учетом хорошей взаимодействия, используйте ONVIF только для единственного обнаружения и управления настройками.
Я использую openRTSP на нескольких Raspberry Pi B+, работающих на Raspbian. Каждый поток 1280×1024 занимает около 8-10% времени CPU, и я успешно запускал до восьми камер на одном RPi, записывая файлы на хранилище NAS. Другой RPi обрабатывает завершенные файлы с помощью ffmpeg, ищет движение и создает индексные PNG изображения этих кадров, чтобы помочь в обнаружении краж.
Существует проект с открытым исходным кодом под названием ZoneMinder, который занимается этой последней частью, но мне не удалось заставить его работать с моими камерами. Поддержка ONVIF в ZM новая и только начинает развиваться, и она, похоже, не справляется с рывками RTSP-потоков, созданных моей коллекцией IP-камер стоимостью менее $100.
Если я верно понимаю ваш вопрос, почему бы вам не попробовать следующую команду на Linux-системе (RPi):
ffmpeg -i rtsp://192.168.0.21:554/mpeg4 -vcodec copy -acodec copy -map 0 -f segment -segment_time 300 -segment_format mp4 "ffmpeg_capture-%03d.mp4"
Это должно сохранить видео в сегментах по 300 секунд. (Обратите внимание, что длина клипа будет зависеть от ваших входящих и выходящих частот кадров)
Я просто хотел бы добавить свои два цента и дополнить ответ BjornR.
Вместо того чтобы запускать задачу cron для периодического завершения процесса VLC, можно сказать VLC работать в течение определенного времени и закрыться после этого.
Это команда, которую я запускаю на своем компьютере:
/usr/bin/vlc -vvv rtsp://192.168.1.128:1554/11 --sout=file/ts:/media/path/to/save/location/recording-$(date +"%Y%m%d%H%M%S").ts -I dummy --stop-time=480 vlc://quit
Это запускает VLC на указанный промежуток времени, а затем закрывается. Параметр vlc://quit необходим, так как VLC остановит запись и останется открытым. Эта команда должна быть помещена в цикл.
Единственная проблема, с которой я столкнулся, заключается в том, что она может пропускать несколько секунд каждый раз, когда начинается новая запись.
VLC выглядит как идеальный кандидат для обработки вашего потока. Основные методы захвата потока описаны на сайте Videolan. Я успешно записывал выходные данные своей сетевой камеры D-Link DCS-5222, используя следующую команду:
vlc rtsp://user:password@ip/play1.sdp --sout=file/ogg:mystream.ogv
В вашем случае это может сработать для сохранения вывода локально:
vlc rtsp://192.168.0.21:554/mpeg4 --sout=file/ts:mystream.mpg
Я бы предложил запустить скрипт, который завершал бы этот процесс VLC и запускал новую инстанцию каждые 30 минут, так как я не уверен, что VLC может это сделать.
Что касается хранения на NAS, просто смонтируйте его в вашу локальную файловую систему.
Решение “все в одном” (захват, отображение, запись по событиям …) – это Shinobi. У него хорошая веб-основная интерфейса и хорошая производительность. Я использую его с различными IP-камерами (потоки h264 RTSP).
Уве
Просто используя ffmpeg
, можно решить задачу. Цитируя из этого блога.
Вот код:
ffmpeg -hide_banner -y -loglevel error -rtsp_transport tcp -use_wallclock_as_timestamps 1 -i rtsp://username:[email protected]:554/stream1 -vcodec copy -acodec copy -f segment -reset_timestamps 1 -segment_time 900 -segment_format mkv -segment_atclocktime 1 -strftime 1 %Y%m%dT%H%M%S.mkv
Объяснение в блоге по ссылке (не мой блог).
Я на самом деле использую -segment_atclocktime 0
.
Вам нужно отредактировать rtsp
URL, чтобы он работал с вашими камерами.
Ответ или решение
Для захвата потока RTSP с IP-камеры и сохранения его на NAS (например, FreeNAS) из систем на базе FreeBSD или Linux (включая Raspberry Pi), можно использовать несколько подходов. Один из самых популярных и мощных инструментов для этой задачи – это FFmpeg. Ниже приведены пошаговые инструкции для настройки и выполнения этой задачи.
1. Установка FFmpeg
Сначала необходимо установить FFmpeg на вашей системе. Для этого выполните следующую команду в терминале:
sudo apt update
sudo apt install ffmpeg
2. Захват потока RTSP
Следующий шаг — это использование FFmpeg для захвата RTSP-стрима. Команда ниже позволит сохранить поток в формате MKV
, создавая файлы каждые 30 минут (1800 секунд):
ffmpeg -i rtsp://192.168.0.21:554/mpeg4 -c copy -f segment -segment_time 1800 -reset_timestamps 1 -strftime 1 "/mnt/nas/съемка_%Y%m%d_%H%M%S.mkv"
Объяснение параметров:
-i rtsp://192.168.0.21:554/mpeg4
— это ваш URL RTSP.-c copy
— копирует кодек (без перекодирования).-f segment
— указывает, что выходной файл будет разбит на сегменты.-segment_time 1800
— задает время сегмента в секундах (30 минут).-reset_timestamps 1
— сбрасывает временные метки для каждого нового файла.-strftime 1
— разрешает использование формата времени в именах файлов."/mnt/nas/съемка_%Y%m%d_%H%M%S.mkv"
— путь, где будут сохраняться файлы.
3. Настройка автоматического захвата
Чтобы операция захвата происходила непрерывно, можно настроить скрипт, который будет запускаться с помощью cron. Создайте bash-скрипт, например capture_stream.sh
:
#!/bin/bash
ffmpeg -i rtsp://192.168.0.21:554/mpeg4 -c copy -f segment -segment_time 1800 -reset_timestamps 1 -strftime 1 "/mnt/nas/съемка_%Y%m%d_%H%M%S.mkv"
Не забудьте сделать файл исполняемым:
chmod +x capture_stream.sh
И добавьте запись в crontab, чтобы скрипт запускался автоматически:
crontab -e
Добавьте следующую строку, чтобы скрипт запускался каждый час (например):
@hourly /path/to/capture_stream.sh
4. Использование VLC
Если вам нужен более простой вариант, вы можете использовать VLC с командной строки. Установите VLC и запустите следующую команду:
cvlc rtsp://192.168.0.21:554/mpeg4 --sout=file/ts:/mnt/nas/съемка-%Y%m%d-%H%M%S.ts --stop-time=1800 vlc://quit
Эта команда запускает VLC для записи на 30 минут и автоматически завершает процесс.
5. Мониторинг и управление процессом
С учетом нестабильной работы некоторых IP-камер важно контролировать работоспособность вашей записи. Для этого используйте скрипт на Python, который будет следить за процессом FFmpeg и перезапускать его в случае необходимости.
Заключение
Теперь у вас есть полное руководство по захвату RTSP-потока с IP-камеры и его сохранению на NAS. Вы можете настроить скрипты и команды по своему усмотрению, чтобы добиться наилучших результатов. Если возникнут сложности с потоками или производительностью системы, вы можете рассмотреть использование более мощных решений, таких как ZoneMinder или Shinobi.