A network video recorder for multiple IP cameras using VLC.
MLUG presentation slides on electric_eye
I’ve been using Zoneminder & motion and these programs are either too large for my requirements (zoneminder) or don’t work with the cameras I own (motion). What I did notice is all my cameras work through VLC with high resolution and VLC can record.
The problem was though VLC doesn’t automate the recordings or handle the file structure nicely. This is where I started to think about creating an application which records from VLC and nicely sorts those recordings in directories by date & time.
- VLC - recording & motion detection
- xvfb - Running virtual frame buffers (ie: desktops)
- ruby
- Linux (Tested on Debian 7)
Under linux install vlc xvfb & ruby
sudo apt-get install vlc xvfb ruby
Add this line to your application’s Gemfile:
gem 'electric_eye'
And then execute:
$ bundle
Or install it yourself as:
$ gem install electric_eye
Enter your cameras into the JSON config file like so
--- duration: 60 path: "/media/data/recordings/temp" threshold: 2 cameras: - :name: Reception :url: rtsp://<user>:<passwd>@<camera's ip>/live2.sdp - :name: Kitchen :url: rtsp://<user>:<passwd>@<camera's ip>/live2.sdp - :name: Workstations :url: rtsp://<user>:<passwd>@<camera's ip>/live2.sdp
You should be able to view the URL through vlc before using this program.
The recordings directory will end up with these directories
/media/data/recordings/reception/20150527 /media/data/recordings/kitchen/20150527
Notice the date at the end of these paths, there will be one for each day. The contents within will be recordings which are done by default every 10minutes, example;
20150527-1020-reception.mjpeg 20150527-1030-reception.mjpeg 20150527-1040-reception.mjpeg
The default is going to be 10 minute blocks, this can be overridden with the duration variable above in minutes.
First make sure you add your cameras
electric_eye -a Reception <url>
Now start the daemon to start the recording process
electric_eye -s
Start with debug messages
electric_eye -s --log-level=debug
Stop all recordings
electric_eye -k
Usage in development mode
bundle exec bin/electric_eye -h
To start the service on boot (on a linux machine) add the following
Add the following to /etc/init/electric_eye
#!/usr/bin/env ruby # # Electric Eye # # chkconfig: 2345 80 20 # description: Network Video Recorder RBENV_DIR= '/usr/local/rbenv/shims' APP_NAME = 'electric_eye' case ARGV.first when 'start' system "su johnsmith -c \"#{RBENV_DIR}/electric_eye -s\"" when 'stop' system "su johnsmith -c \"#{RBENV_DIR}/electric_eye -k\"" when 'restart' system "su johnsmith -c \"#{RBENV_DIR}/electric_eye -k\"" sleep 0.5 system "su johnsmith -c \"#{RBENV_DIR}/electric_eye -s\"" end unless %w{start stop restart}.include? ARGV.first puts "Usage: #{APP_NAME} {start|stop|restart}" exit end
Make executable & add to startup
cd /etc/init.d chmod +x electric_eye update-rc.d electric_eye defaults
Replace johnsmith with your user where you have setup your camera profiles. NOTE: I cannot get it working nicely with the root user.
Cleaning up recordings. Put the following into your /etc/crontab per recording directory.
00 19 * * * root /usr/bin/find <directory to recordings> -type f -mtime +<days> -exec rm {} \;
Example for cleaning up reception after 60days at 7pm everynight.
00 19 * * * root /usr/bin/find /media/recordings/reception -type f -mtime +60 -exec rm {} \;
- Fork it ( https://github.com/map7/electric_eye/fork )
- Create your feature branch (`git checkout -b my-new-feature`)
- Commit your changes (`git commit -am ‘Add some feature’`)
- Push to the branch (`git push origin my-new-feature`)
- Create a new Pull Request
- [X] Add more testing
- [X] Add post recording motion detection (use vlc)
- [X] Make sure we cannot add blank cameras
- [X] Create threshold as a variable
- [ ] Add a feature to clean up old recordings using a “period” setting EG: 60 day period which could be set in the config file how many days you want to keep Then just call ‘electric_eye –remove-recordings’ within crontab This would iterate over all my cameras and remove old recordings to keep a rolling set of days.
- [ ] Allow different recording programs like raspicam
- [ ] Do inline motion detection (using activevlc)