Streaming palio

Da MontelLUG.
Menu
MontelLUG frontpage
Feed RSS ultime modifiche
Aiuto: Come modificare le pagine


Trasmissione del Palio di Vidor in streaming

Di seguito sono riportati alcuni script e note per poter eseguire la trasmissione di immagini grabbate ogni tot secondi dalla videocamera o webcam, upload in FTP, gestione di una coda di immagini e riproduzione web delle immagini in sequenza.

Acquisizione di immagini e trasmissione in FTP

Acquisizione da dispositivo IEEE1394

Le videocamere solitamente dispongono di una porta firewire per la comunicazione con un PC. Utilizzando dvgrab e ncftpput è possibile inviare le immagini acquisite ogni intervallo di tempo ad un sito FTP per poterle inserire in una coda da cui saranno poi recuperate per la visualizzazione nel web.

#!/bin/bash
# palio.sh
# Invia ogni INTERVAL secondi una immagine grabbata da firewire

INTERVAL=10             # seconds between grabbed photos
# FTP server parameters
HOST=123.456.789.123    # FTP server hostname
USERNAME=xxxxxx         # user which access on the FTP server
PASSWORD=XXXXXX         # user's password
DIR=www                 # directory where the following file should be placed
#FILENAME=image1.jpg    # intermedio
FILENAME=image2.jpg     # arrivo

cd /tmp
filename="/tmp/image"
# killall dvgrab
killall -9 dvgrab 2>/dev/null
sleep 1
# start background grabbing every 10 seconds (--every 250)
dvgrab --noavc --format jpeg --jpeg-quality 50 \
  --jpeg-width 352 --jpeg-height 288 --jpeg-deinterlace --jpeg-overwrite \
  --every $(( $INTERVAL * 25 )) $filename &

#main loop
while [ 1 ]; do
  if [ -f $filename.jpg ]; then
    # Image grabbed: wait 1 second to be sure the image file is closed
    sleep 1
    mv $filename.jpg $FILENAME
    # send the image to the FTP server
    ncftpput -u $USERNAME -p $PASSWORD $HOST $DIR $FILENAME
    rm $FILENAME
  fi
  sleep 1
done

Scripts da utilizzare nel server

Script che controlla le immagini da riprodurre nel web

Il seguente script organizza una coda di immagini e le visualizza, con un opportuno ritardo per consentire una approssimativa sincronizzazione fra le immagini e l'audio che verrà trasmesso mediante shoutcast o icecast.

Le immagini vengono inoltre backuppate per utilizzi futuri.

#! /bin/bash
#ftpinfilectl
#Controlla le immagini imageN.jpg e le rinomina in cimageN.jpg quando
#la loro dimensione rimane costante per 3 secondi.
QUEUESECONDS=80
IMAGEAGESECONDS=43200
HOMEDIR=/home/palio
WORKDIR=$HOMEDIR/www
BINDIR=$HOMEDIR/bin
BACKUPDIR=$WORKDIR/backup
QUEUEDIR=$WORKDIR/queue


function managefile () {
  file="image$1.jpg"
  if [ -r $file -a -s $file ]; then
    newsize="`ls -l $file|awk '{print $5}'`"
    if [ $newsize -eq ${size[$1]} ]; then
#file completed?
      count[$1]=$(( ${count[$1]}+1 ))
      if [ ${count[$1]} -ge 3 ]; then
        # new image
        # backup image
        if [ ! -f /tmp/ftpin$1.count ]; then
          num=0
        else
          num=`cat /tmp/ftpin$1.count`
        fi
        num=`echo $num+0.00001|bc`
        echo $num >/tmp/ftpin$1.count
        basename=`echo $file|cut -d . -f 1`
        ext=`echo $file|cut -d . -f 2`
        cp $file $BACKUPDIR/$basename$num.$ext
        # insert image in the input queue
        mv $file $QUEUEDIR/$basename$num.$ext
         count[$1]=0
        size[$1]=0
      fi
    else
#new size differ
#echo "newsize=$newsize"
      size[$1]=$newsize
      count[$1]=0
    fi
  else
# file does not exists
#echo "file $file does not exists"
    count[$1]=0
    size[$1]=0
  fi
}

function readqueue () {
  # read image queue and write images to cimage$1.jpg
  infile="`ls $QUEUEDIR/image$1*.jpg 2>/dev/null|head -n 1`"
  if [ -n "$infile" ]; then
    if [ `$BINDIR/filedatecmp.tcl $infile` -ge $QUEUESECONDS ]; then
#echo "copy $infile in cimage$1.jpg"
      cp $infile $WORKDIR/cimage$1.jpg
      rm $infile
    fi
  fi
}

function imageage () {
  if [ -f cimage$1.jpg ]; then
    if [ `$BINDIR/filedatecmp.tcl cimage$1.jpg` -ge $IMAGEAGESECONDS ]; then
      rm cimage$1.jpg
    fi
  fi
}


OLDDIR="`pwd`"
cd $WORKDIR

count[1]=0;count[2]=0
size[1]=0;size[2]=0

while [ 1 ]; do
  #backup image, if any
  managefile 1
  managefile 2
  #show new image, if any, from the queue
  readqueue 1
  readqueue 2
  #if cimage* is very old, remove it
  imageage 1
  imageage 2
  #import sql database
  if [ -f $HOMEDIR/palio.sql.bz2 ]; then
    if [ `$BINDIR/filedatecmp.tcl $HOMEDIR/palio.sql.bz2` -ge 30 ]; then
      bzcat $HOMEDIR/palio.sql.bz2 |mysql -u palio --password=150673 palio
      rm $HOMEDIR/palio.sql.bz2
    fi
  fi
  sleep 1
done
cd $OLDDIR

Il file ftpinfilectl necessita di uno script TCL aggiuntivo, filedatecmp.tcl sottoriportato, per misurare l'età di ciascuna immagine.

#!/usr/bin/tclsh
# filedatecmp.tcl
# syntax: $0 filename
# Return amount of seconds from mtime of filename and current date
puts [expr [clock seconds] - [file mtime [lindex $argv 0]]]