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

Przechwytywanie strumienia RTSP z kamery IP i przechowywanie

Mam kilka kamer IP, które wysyłają strumień RTSP (h264 mpeg4).

Uderzając w adres URL lokalnie przez VLC: rtsp://192.168.0.21:554/mpeg4

Mogę strumieniować kamerę i zrzucać na dysk (na moim pulpicie). Chciałbym jednak przechowywać te pliki na moim NAS (FreeNAS). Szukałem sposobów na przechwytywanie strumienia RTSP i zrzucanie ich na dysk, ale nie mogę nic znaleźć.

Czy jest możliwe przechwycenie strumienia na FreeBSD lub Linuksie (RaspberryPi) i zrzucanie strumienia na dysk lokalny dla Linuksa lub FreeBSD - najlepiej co 30minut?

EDIT: NAS jest bezgłowy (HP N55L czy coś takiego) i RaspberryPi też są bezgłowe.

Sprawdzałem już ZoneMindera, ale potrzebuję czegoś małego. Miałem nadzieję, że może użyję Motion do wykrywania ruchu na strumieniu, ale to przyjdzie później.

Odpowiedzi (4)

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

Kamery IP są różnej jakości, niektóre z nich zachowują się błędnie z mojego doświadczenia. Radzenie sobie z ich strumieniami RTSP wymaga pewnej dozy tolerancji na błędy.

Projekt Live555 dostarcza względnie odporną na błędy implementację klienta RTSP, openRTSP, do pobierania strumieni RTSP audio/wideo przez CLI: http://www.live555.com/openRTSP/

Na przykład, aby zapisać strumień RTSP audio/wideo z kamery do plików w formacie QuickTime (AVI i MP4 również dostępne), jeden plik co 15 minut:

$ 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

Opcje te oznaczają:

-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

Usunięcie opcji -t powoduje, że openRTSP domyślnie wybiera zamiast tego UDP, co może nieco zmniejszyć ruch w sieci. Będziesz musiał pobawić się opcjami, aby znaleźć kombinację, która Ci odpowiada.

Szczerze mówiąc, same kamery są czasami zawodne, lub po prostu zaimplementowane inaczej - np. niespodziewane zamknięcie gniazda nie jest niczym niezwykłym.

Czasami klient openRTSP nie wyłapuje tych błędów. Zdecydowałem się więc na zakodowanie kontrolera w Pythonie, używając modułu ‘subprocesów’ do wywoływania i monitorowania stdout każdej instancji klienta openRTSP, a także sprawdzania, czy pliki nadal zwiększają swój rozmiar.

Wydaje się, że jest to produkt uboczny niskiej klasy przemysłu CCTV, który bawi się szybko i luźno ze standardami, RTSP i ONVIF są dwoma najczęściej nadużywanymi.

Na szczęście, zazwyczaj można obejść te problemy. Jeśli kamery IP i kontroler nie są zaprojektowane tak, aby ładnie ze sobą współpracowały, należy używać ONVIF tylko do jednorazowego wykrywania i zarządzania ustawieniami.

Używam openRTSP na kilku Raspberry Pi B+ z systemem Raspbian. Każdy strumień 1280x1024 zajmuje około 8-10% czasu procesora i udało mi się z powodzeniem uruchomić do ośmiu kamer na RPi, zapisując pliki do pamięci NAS. Inny RPi przetwarza gotowe pliki za pomocą ffmpeg, wyszukując ruch i produkując indeksowane PNG tych klatek, aby pomóc w wykrywaniu włamań.

Istnieje program open-source o nazwie ZoneMinder, który wykonuje tę ostatnią część, ale nie udało mi się go uruchomić z moimi kamerami. Obsługa ONVIF jest nowa i dopiero się rodzi w ZM, i nie wydaje się, aby dobrze radził sobie z punktowymi strumieniami RTSP produkowanymi przez moją menażerię kamer IP za mniej niż 100$.

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

Jeśli dobrze rozumiem twoje pytanie, dlaczego nie spróbujesz wykonać następującego polecenia na systemie 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"

To powinno zapisać wideo w kawałkach po 300 sekund. (Zauważ, że długość klipu będzie zależała od ilości klatek na wejściu i wyjściu)

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

Po prostu pomyślałem, że dodam swoje dwa centy i uzupełnię odpowiedź BjornR.

Zamiast uruchamiać zadanie cron, aby okresowo zabijać proces VLC, można powiedzieć VLC, aby działał przez określony czas i zamknął się po tym.

To jest polecenie, które uruchamiam na moim komputerze:

/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

To uruchamia VLC przez określony czas, a później kończy działanie. Parametr vlc://quit jest wymagany, ponieważ VLC zatrzymałby nagrywanie i pozostałby otwarty. Ta komenda musi być umieszczona wewnątrz pętli.

Jedynym problemem jaki do tej pory znalazłem jest to, że może przegapić kilka sekund za każdym razem, gdy rozpoczyna się nowe nagranie.

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

VLC wygląda jak idealny kandydat do przetwarzania twojego strumienia Podstawowe metody przechwytywania strumienia są opisane na stronie Videolan. Udało mi się nagrać wyjście z mojej kamery sieciowej D-Link DCS-5222 za pomocą następującego polecenia:

vlc rtsp://user:password@ip/play1.sdp --sout=file/ogg:mystream.ogv

W twoim przypadku może to zadziałać, aby zapisać wyjście lokalnie:

vlc rtsp://192.168.0.21:554/mpeg4 --sout=file/ts:mystream.mpg

Sugerowałbym uruchomienie skryptu, który kończy ten proces vlc i uruchamia nową instancję co 30 minut, ponieważ nie jestem pewien, czy VLC jest w stanie to zrobić.

Jeśli chodzi o przechowywanie na NAS-ie, po prostu zamontuj go w lokalnym systemie plików.