Abadikan streaming RTSP dari IP Camera dan simpan

18

Saya punya beberapa Kamera IP yang menghasilkan aliran RTSP (h264 mpeg4).

Memukul URL secara lokal melalui VLC: rtsp: //192.168.0.21: 554 / mpeg4

Saya dapat melakukan streaming kamera dan membuangnya ke disk (di desktop saya). Namun saya ingin menyimpan file-file ini di NAS saya (FreeNAS). Saya mencari cara untuk menangkap aliran RTSP dan membuangnya ke disk tetapi saya tidak dapat menemukan apa pun.

Apakah mungkin untuk menangkap streaming di FreeBSD atau Linux (RaspberryPi) dan membuang konten yang dialirkan ke disk lokal ke Linux atau FreeBSD - lebih disukai setiap 30 menit?

EDIT: NAS tanpa kepala (HP N55L atau apalah) dan RaspberryPi juga tanpa kepala.

Saya sudah melihat ke ZoneMinder tetapi butuh sesuatu yang kecil. Saya berharap mungkin menggunakan Motion untuk mendeteksi gerakan di sungai tetapi itu akan datang nanti.

Keerthi
sumber
Mengapa tidak menggunakan VLC untuk linux?
LatinSuD
1
oops, saya lupa menyebutkan bahwa server FreeNAS dan RaspberryPi tidak memiliki kepala!
Anda dapat menggunakan VLC dari baris perintah. Bukan sepele, tapi mungkin.
LatinSuD
Karena RTSP hanyalah sebuah protokol, apakah ia akan membuang konten h264 atau apakah saya harus meminta VLC untuk mentranskodenya?
1
Nah itu bagian dari voodoo baris perintah VLC, dan maaf itu sebabnya saya tidak memberi Anda jawaban penuh di sini. Saya pikir transcoding penuh tidak diperlukan tetapi mungkin mengubah wadah. Saya harap beberapa pakar VLC muncul di sini.
LatinSuD

Jawaban:

29

Kamera IP memiliki kualitas yang beragam, beberapa berperilaku tidak menentu menurut pengalaman saya. Berurusan dengan aliran RTSP mereka membutuhkan dosis toleransi kesalahan.

Proyek Live555 menyediakan implementasi klien RTSP yang relatif toleran terhadap kesalahan, openRTSP, untuk menarik aliran audio / video RTSP melalui CLI: http://www.live555.com/openRTSP/

Misalnya, untuk menyimpan audio / video RTSP kamera ke file dalam format QuickTime (AVI dan MP4 juga tersedia), satu file setiap 15 menit:

$ 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

Opsi-opsi ini berarti:

-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

Menghapus opsi -t menyebabkan openRTSP menjadi default ke UDP, yang dapat mengurangi lalu lintas jaringan sedikit. Anda harus bermain dengan opsi untuk menemukan kombinasi yang cocok untuk Anda.

Terus terang, kamera itu sendiri kadang-kadang tidak dapat diandalkan, atau hanya diimplementasikan secara berbeda - seperti menutup soket secara tidak terduga bukanlah hal yang aneh.

Terkadang klien openRTSP tidak menangkap gangguan ini. Jadi saya memilih kode pengontrol dengan Python menggunakan modul 'subprocesses' untuk memanggil dan memantau stdout dari setiap instance klien openRTSP, dan juga memeriksa apakah file terus bertambah besar.

Ini tampaknya merupakan produk sampingan dari industri CCTV kelas bawah yang bermain cepat dan longgar dengan standar, RTSP dan ONVIF menjadi dua produk yang paling sering disalahgunakan.

Untungnya, Anda biasanya dapat mengatasi masalah ini. Kecuali jika kamera dan pengontrol IP Anda semuanya dirancang untuk bermain bersama dengan baik, hanya gunakan ONVIF untuk manajemen pengaturan dan penemuan sekali saja.

Saya menggunakan openRTSP pada beberapa Raspberry Pi B + yang menjalankan Raspbian. Setiap aliran 1280x1024 menempati sekitar 8-10% dari waktu CPU, dan saya telah berhasil menjalankan hingga delapan kamera per RPi, menulis file ke penyimpanan NAS. Proses RPi lain menyelesaikan file dengan ffmpeg, mencari gerakan dan menghasilkan indeks PNG dari frame-frame itu, untuk membantu menemukan pembobolan.

Ada upaya sumber terbuka yang disebut ZoneMinder yang melakukan bagian terakhir ini, tetapi saya tidak dapat membuatnya bekerja dengan kamera saya. Dukungan ONVIF baru dan baru lahir di ZM, dan sepertinya tidak cocok dengan aliran RTSP yang buruk yang dihasilkan oleh kamera IP kamera saya yang di bawah $ 100.

Kevin-Prichard
sumber
Solusi hebat Kevin, bisakah Anda berbagi lebih banyak dengan pencarian gerakan / solusi pengindeksan png - setidaknya tempat untuk menggali lebih jauh?
Igor
@ Kevin-Prichard Saya ingin mengerti, 1. Jika saya dapat mengonversi katakan Analog SD CVSB ke aliran IP apakah solusi Anda akan berfungsi? (Saya ingin merekam video mp4 dalam 1 jam potongan dari masing-masing sumber) Dan apakah saya dapat merekam 300 stream seperti itu melalui jaringan tunggal 24/7 atau akankah ini membebani jaringan? 2. Apakah mungkin untuk mengubah Analog SD / CVSB ke aliran IP?
CP3O
7

Saya hanya berpikir saya akan menambahkan dua sen dan melengkapi jawaban BjornR.

Alih-alih menjalankan tugas cron untuk secara berkala membunuh proses VLC, orang dapat memberitahu VLC untuk menjalankan selama waktu tertentu dan menutupnya setelah itu.

Ini adalah perintah yang saya jalankan di kotak saya:

/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

Ini menjalankan VLC untuk jumlah waktu yang ditentukan dan kemudian keluar. Vlc: // keluar dari parameter diperlukan karena VLC akan berhenti merekam dan tetap terbuka. Perintah ini perlu ditempatkan di dalam lingkaran.

Satu-satunya masalah yang saya temukan sejauh ini adalah mungkin akan kehilangan beberapa detik setiap kali rekaman baru dimulai.

Juanpi
sumber
7

Jika saya mengikuti pertanyaan Anda dengan benar, mengapa Anda tidak mencoba perintah berikut pada sistem 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"

Ini harus menyimpan video dalam potongan 300 detik. (Perhatikan bahwa panjang klip akan tergantung pada kecepatan bingkai input dan output Anda)

Aldo
sumber
5

VLC terlihat seperti kandidat yang ideal untuk memproses streaming Anda. Metode dasar untuk menangkap aliran dijelaskan di situs web Videolan. Saya berhasil merekam output dari kamera jaringan D-Link DCS-5222 saya menggunakan perintah berikut:

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

Dalam kasus Anda, ini mungkin berfungsi untuk menyimpan output secara lokal:

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

Saya menyarankan untuk menjalankan skrip yang mengakhiri proses vlc ini dan meluncurkan contoh baru setiap 30 menit karena saya tidak yakin VLC dapat melakukan ini.

Sedangkan untuk menyimpan pada NAS, pasang saja ke sistem file lokal Anda.

BjornR1989
sumber
1
Anda juga dapat menggunakan FFMPEG untuk melakukan pekerjaan yang persis sama. Anda masih perlu memasang NAS Anda sesuai jawaban yang disarankan.
Kinnectus