Streaming palio
Da MontelLUG WIKI.
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]]]