Запись RTSP-потока с IP-камеры и его сохранение

Вопрос или проблема

Запись 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.

Оцените материал
Добавить комментарий

Капча загружается...