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

18

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

Keerthi
источник
Почему бы не использовать VLC для Linux?
LatinSuD
1
К сожалению, я забыл упомянуть, что и сервер FreeNAS, и RaspberryPi безголовы!
Вы можете использовать VLC из командной строки. Не тривиально, но возможно.
LatinSuD
Поскольку RTSP - это просто протокол, будет ли он просто выгружать контент h264 или мне нужно получить VLC для его перекодирования?
1
Ну, это часть командной строки VLC voodoo, и извините, поэтому я не даю вам полного ответа здесь. Я думаю, что полное перекодирование не является необходимым, но, возможно, изменить контейнер. Я надеюсь, что здесь появится какой-нибудь эксперт VLC.
LatinSuD

Ответы:

29

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 долларов.

Кевин-Причард
источник
Отличное решение, Кевин, не могли бы вы поделиться с решением для поиска и индексации в формате png - хотя бы где покопаться дальше?
Игорь
@ Kevin-Prichard Я хотел понять, 1. Если бы я мог преобразовать, скажем, Analog SD CVSB в IP-поток, сработало бы ваше решение? (Я хочу записывать видео в формате mp4 с интервалом в 1 час из каждого источника). Смогу ли я записать 300 таких потоков в одной сети 24/7 или это приведет к перегрузке сети? 2. Можно ли конвертировать аналоговый SD / CVSB в IP-поток?
CP3O
7

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

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

Аньор, Хуанпите
источник
7

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

Aldo
источник
5

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

BjornR1989
источник
1
Вы также можете использовать FFMPEG для выполнения точно такой же работы. Вам все еще нужно будет смонтировать NAS в соответствии с предложенным ответом.
Kinnectus