Cctv

From ElphelWiki
Revision as of 01:18, 30 January 2009 by Xab (talk | contribs) (Quick and Dirty cctv scripts)
Jump to: navigation, search

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 333.

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 02:18, 30 January 2009 (CST)