Creare un filmato da una serie di immagini con AVCONV (ex FFMPEG)
Una prerogativa di quasi tutte le webcam IP di fascia madio\bassa è quella di non avere un sistema di salvataggio dello streaming su filmato ma solo di poter salvare le schermate ogni tanto e memorizzarle in un percorso remoto, magari via FTP.
Possiamo convertire queste immagini in un filmato in pochi passaggi tramite il programma avconv ( ex ffmpeg ):
sudo apt-get install ffmpeg
Nonostante il nuovo nome del programma sia avconv si installa ancora con il vecchio nome per un discorso di retrocompatibilità, il programma stesso comunque se eseguito come ffmpeg avverte:
$ ffmpeg
ffmpeg version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
built on Apr 2 2013 17:00:59 with gcc 4.6.3
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Innanzitutto impostiamo la webcam IP di nominare le foto nel formato image_YYYYMMDD_HHMMSS.jpg per avere il riferimento temporale, di scattare una foto ad esempio ogni 3 secondi e di salvarla in un percorso FTP ( ogni dispositivo ha le sue impostazioni ).
Se il percorso FTP remoto punta già alla nostra macchina abbiamo già i file in locale, altrimenti dobbiamo collegarci al server FTP per prelevare le immagini, per questo è possibile utilizzare curlftpfs che ci permette di montare un percorso FTP:
sudo apt-get install curlftpfs
Questo script esegue tutte le operazioni di lettura delle immagini e di conversione in filmato mettendo nel nome i riferimenti temporali delle immagini:
#!/bin/bash
# Percorso dove viene montato la cartella FTP remota
PATHR="/percorso/locale"
# Percorso dove verranno spostate le immagini da processare
PATHIMG="/percorso/immagini"
# Percorso dove salvare il filmato
PATHMOV="/percorso/filmati"
# Esegue il mount del percorso FTP
curlftpfs ftp://utente:password@server/percorso/remoto $PATHR
# Legge tutti i files da processare
for fullfile in $PATHR/*
do
if [[ -f $fullfile ]]; then
# Ottengo solo il nome del file escludendo il percorso
file=$( /usr/bin/basename "$fullfile" )
array_files[${#array_files[*]}]=$file
fi
done
# Ottiene il primo e l'ultimo file per reperire i riferimenti temporali
FILEFROM=${array_files[0]}
FILETO=${array_files[${#array_files[@]} - 1]}
# Ottiene la parte YYYYMMDD_HHMMSS del primo file
FILEEXT=(${FILEFROM//./ })
FILE=${FILEEXT[0]}
EXT=${FILEEXT[1]}
FILEPARTS=(${FILE//_/ })
FROM="${FILEPARTS[1]}_${FILEPARTS[2]}"
# Ottiene la parte YYYYMMDD_HHMMSS dell'ultimo file
FILEEXT=(${FILETO//./ })
FILE=${FILEEXT[0]}
EXT=${FILEEXT[1]}
FILEPARTS=(${FILE//_/ })
TO="${FILEPARTS[1]}_${FILEPARTS[2]}"
# Sposta i files e li rinomina con un ID numerico progressivo
x=1;
for i in "${array_files[@]}"; do
counter=$(printf %03d $x);
/bin/mv $PATHR/$i $PATHIMG/"$counter".jpg
x=$(($x+1));
done
# Crea il filmato, il parametro -r 5 indica i FPS da usare, se omesso usa 25
/usr/bin/avconv -f image2 -r 5 -i $PATHIMG/%03d.jpg "${PATHMOV}/movie-${FROM}-${TO}.avi"
# Rimuove le immagini
/bin/rm $PATHIMG/*
# Scollega il percorso remoto
umount $PATHR