2014-06-09 08:56:55 +0000 2014-06-09 08:56:55 +0000
18
18
Advertisement

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

Advertisement

У меня есть несколько IP-камер, которые выводят поток RTSP (h264 mpeg4).

Нажатие на URL локально через VLC: rtsp://192.168.0.21:554/mpeg4

Я могу передавать поток камеры и дамп на диск (на моем рабочем столе). Однако я хотел бы сохранить эти файлы на моем NAS (FreeNAS). Я искал способы захвата RTSP потока и выгрузки их на диск, но ничего не нашел.

Можно ли перехватить поток на FreeBSD или Linux (RaspberryPi) и выгрузить содержимое потока на локальный диск под Linux или FreeBSD - желательно каждые 30 минут?

EDIT: Сетевое хранилище без головы (HP N55L или что-то в этом роде) и RaspberryPi тоже без головы.

Я уже изучил ZoneMinder, но мне нужно что-то маленькое. Я надеялся, что, возможно, использую Motion для обнаружения движения в потоке, но это произойдет позже.

Advertisement

Ответы (4)

30
30
30
2015-05-29 22:33:16 +0000

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, что может немного уменьшить сетевой трафик. Вам нужно поиграть с опциями, чтобы найти подходящую комбинацию.

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

Иногда клиент openRTSP не ловит эти глюки. Поэтому я решил закодировать контроллер на Python с помощью модуля ‘подпроцессов’ для вызова и мониторинга stdout каждого экземпляра клиента 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.

7
7
7
2017-06-26 12:49:23 +0000

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

7
Advertisement
7
7
2015-04-01 22:52:30 +0000

Я просто подумал, что мог бы добавить свои два цента и дополнить ответ БьорнР.

Вместо того, чтобы выполнять задание 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 останавливает запись и остается открытым. Эта команда должна быть помещена в контур.

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

5
5
5
2014-06-09 12:06:59 +0000

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 сможет это сделать.

Что касается хранения на сетевом хранилище, просто подключите его к вашей локальной файловой системе.

Похожие вопросы

6
10
5
37
3
Advertisement
Advertisement