15

У меня есть несколько 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 для обнаружения движения в потоке, но это произойдет позже.

4 ответа4

22

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 # Quit if no packets for 1 second or more
-c   # Continuously record, after completion of -d timeframe
-B 10000000 # Input buffer of 10 MB
-b 10000000 # Output buffer 10MB (to file)
-q   # Produce files in QuickTime format
-Q   # Display QOS statistics 
-F cam_eight  # Prefix output filenames with this text
-d 28800      # Run openRTSP this many seconds
-P 900        # Start a new output file every -P seconds
-t            # Request camera end stream over TCP, not UDP
-u admin 123456  # Username and password expected by camera
rtsp://192.168.1.108:554/11  # Camera's RTSP URL

Удаление опции -t приводит к тому, что openRTSP по умолчанию использует UDP, что может немного уменьшить сетевой трафик. Вам нужно будет поиграть с опциями, чтобы найти подходящую вам комбинацию.

Честно говоря, сами камеры иногда ненадежны, или просто реализованы по- другому - как неожиданно закрытие сокета не так уж и необычно.

Иногда клиент openRTSP не улавливает эти глюки. Поэтому я решил кодировать контроллер на Python, используя модуль 'subprocesses', чтобы вызывать и контролировать стандартный вывод каждого экземпляра клиента openRTSP, а также проверять, продолжают ли увеличиваться в размерах файлы.

Похоже, что это побочный продукт низшей части индустрии CCTV, играющей быстро и свободно со стандартами, RTSP и ONVIF являются двумя наиболее часто злоупотребляемыми.

К счастью, вы обычно можете обойти эти проблемы. Если ваши IP-камеры и контроллер не предназначены для совместной игры, используйте ONVIF только для однократного обнаружения и управления настройками.

Я использую openRTSP на нескольких Raspberry Pi B+ под управлением Raspbian. Каждый поток 1280x1024 занимает около 8-10% времени процессора, и я успешно запускаю до восьми камер на RPI, записывая файлы в хранилище NAS. Другой RPi обрабатывает завершенные файлы с помощью ffmpeg, ищет движение и создает индексные PNG для этих кадров, чтобы помочь в обнаружении взломов.

Есть программа с открытым исходным кодом под названием ZoneMinder, которая выполняет эту последнюю часть, но я не смог заставить ее работать с моими камерами. Поддержка ONVIF является новой и зарождающейся в ZM, и, похоже, она не очень хорошо справляется с разрозненными потоками RTSP, создаваемыми моим зверинцом IP-камер стоимостью менее 100 долларов.

6

Я просто решил добавить свои два цента и дополнить ответ 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 прекращает запись и остается открытым. Эта команда должна быть помещена в цикл.

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

4

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, просто подключите его к локальной файловой системе.

3

Если я правильно понимаю ваш вопрос, почему бы вам не попробовать следующую команду в системе 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 секунд. (Обратите внимание, что длина клипа будет зависеть от частоты кадров на входе и выходе)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .