Cctv
Contents
Introduction
Here is a couple of script to put online a cctv environement based on Mencoder/Mplayer.
The idea is to have a cctv server with enough storage grabing rtsp unicast stream with the timestamp incrusted onscreen.
Hardware
Server:
Dell poweredge 1970
1 quad core Intel Xeon
8go of ram and
500G of disk.
4x Elphel 353.
Setup
A user cctv created locally with /var/cctv as home.
All videos will be stored in /var/cctv/videos/
The goal is to have a script launched everyday that will start a new file with timestamp as name followd by camera number, stop existing recording and cleanup old videos (due to legal reason no more than 30 days must be kept).
Scripts
The tricky part is to generate osd with the same timestamp as the start of the recording.
OSD generation
This script will generate subtitles in srt format
#!/usr/bin/perl -w use strict; my $start=time(); #will generate a day of timestamp my $end=$start+86400; my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ); my $h=0; my $m=0; my $s=0; my ($sec2,$min2,$hour2,$mday2,$mon2,$year2) = localtime($start); while ($start<$end) { if ($s <= 59){ $s++; } if ($s == 60){ $s=0; $m++; } if ($m == 60){ $m=0; $h++; } if ($h==24){ $h=0; } my ($sec,$min,$hour,$mday,$mon,$year)=($sec2,$min2,$hour2,$mday2,$mon2,$year2); $start++; ($sec2,$min2,$hour2,$mday2,$mon2,$year2) = localtime($start); $year2+=1900; printf "%02d:%02d:%02d,001-->%02d:%02d:%02d,1000\n",$h,$m,$s,$h,$m,$s; printf "%02d:%02d:%02d %02d/%s/%02d\n\n",$hour,$min,$sec,$mday,$abbr[$mon],$year; }
It will generate output like
06:38:57,001-->06:38:57,1000 02:13:42 30/Jan/2009 1.timeline from the begining of video (6 hours and 38 minutes since video started) 2.localtime and date
Starting/Stopping and incrust
#!/bin/ksh path="/usr/local/bin"; wdir="/var/cctv"; logsd="$wdir/logs" videosd="$wdir/videos"; subd="$wdir/subs"; rund="$wdir/run"; today=$(date +%y%m%d); for cam in cam0 cam1 cam2 cam3; do # Check if recording already running if [[ -e $rund/$cam.pid ]]; then pid=$(cat $rund/$cam.pid) # Wait until process killed while [[ $(ps -p $pid | grep $pid) != "" ]] do print "Trying cleannig process $cam" kill -15 $pid sleep 2 done rm -f $rund/$cam.pid fi # Generate timestamp now=$(date +%Y%m%d%H%M%S); srt="$now-$cam.srt"; # Generate subtitles /home/cctv/bin/gensubsrt.pl > $subd/$srt; # start recording and incrusting timestamp on screen $path/mencoder rtsp://$cam -sub $subd/$srt -o $videosd/$now-$cam.avi \ -quiet -ovc lavc -vf scale=640:480 < /dev/null > $logsd/$now-$cam 2>&1 & # Store the pid to next kill print $! > $rund/$cam.pid; done
Cleanup
#!/usr/bin/perl -w use strict; use POSIX; use Time::Local; my $days = 30; #how many days to keep my $max_age = $days*86400; my @files = glob('/var/cctv/videos/*'); my $now = time(); for my $file (@files){ if ( $file =~ /\/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})[^\/]+$/ ){ my ($year,$month,$day,$hour,$min,$sec) = ($1,$2,$3,$4,$5,$6); my $file_age = $now-mktime($sec,$min,$hour,$day,$month-1,$year-1900); if ( $file_age > $max_age ) { print "$file too old deleting...\n"; unlink $file; } } }
--xab 12:49, 29 January 2009 (CST)