Знімайте потік 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 хвилин?

EDIT: NAS - без голови (HP N55L чи щось подібне), а RaspberryPi - теж без голови.

Я вже заглянув у ZoneMinder, але мені потрібно щось маленьке. Я сподівався, можливо, використовуючи Motion, щоб виявити рух на потоці, але це надійде пізніше.


Чому б не використовувати VLC для Linux?
LatinSuD

1
oops, я забув згадати, що і сервер FreeNAS, і RaspberryPi без голови!

Ви можете використовувати VLC з командного рядка. Не банально, але можливо.
LatinSuD

Оскільки RTSP - це просто протокол, чи він просто скидає вміст h264 або мені потрібно отримати VLC, щоб перекодувати його?

1
Ну, це частина командного рядка вуду VLC, і вибачте, тому я не даю вам повної відповіді тут. Я думаю, що повністю перекодування не є необхідним, але, можливо, поміняйте контейнер. Я сподіваюся, що тут з'явиться якийсь експерт 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 за допомогою модуля "підпроцеси", щоб викликати та контролювати stdout кожного екземпляра клієнта openRTSP, а також перевірити, чи продовжують збільшуватися розміри файлів.

Це, мабуть, є побічним продуктом індустрії відеоспостереження, що грає швидко та вільно, зі стандартами, а 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. Якби я міг перетворити скажімо, аналоговий SD CVSB в IP-потік, чи буде ваше рішення працювати? (Я хочу знімати mp4 відеозаписи за 1 годину, з кожного джерела) І чи зможу я записати 300 таких потоків через одну мережу 24/7 чи це перевантажить мережу? 2. Чи можливо перетворити Analog SD / CVSB в IP-потік?
CP3O

7

Я просто думав, що додаю свої два центи та доповнив відповідь Бьорна.

Замість того, щоб виконувати завдання 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 секунд. (Зверніть увагу, що довжина кліпу залежатиме від швидкості введення та виводу кадрів)


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


1
Ви також можете використовувати FFMPEG, щоб виконати точно таку ж роботу. Вам все одно потрібно буде встановити NAS, згідно з відповіддю.
Кіннект
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.