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]]]
