View Single Post
Old 07-11-2009, 12:53   #5
gurutech
Senior Member
 
L'Avatar di gurutech
 
Iscritto dal: Jun 2000
Cittą: S.Giuliano (MI)
Messaggi: 1047
Per registrare una finestra di X11 in un filmato AVI usando:
  • xwd - crea uno screenshot dell'intero schermo o una singola finestra di cui si ha l'id numerico
  • xwininfo - fornisce informazioni sulla finestra, in particolare l'id numerico della finestra
  • un comanto usleep creato ad hoc che esegue una sleep per un numero specificato di microsecondi (in fondo a questo post)
  • all'occorenza, un paio di colpi di grep,sed,awk. insomma il copia/incolla del sistemista
  • ImageMagick - il coltellino svizzero per l'elaborazione seriale di immagini
  • Mencoder - il codificatore di filmati fornito con mplayer
ecco lo script:
Codice:
#!/bin/bash
OUTDIR=$(mktemp -d)
TMPFILE=$(mktemp)
echo "Select window to be grabbed"
sleep 3
xwininfo > $TMPFILE
WINID=$(cat $TMPFILE | grep "Window id:" | awk -F "Window id: " '{print $2}' | cut -d " " -f 1)
echo "You selected $WINID"
cat $TMPFILE | grep "$WINID"
echo "Output in $OUTDIR"
echo "Press CTRL-C to stop grab"
for ((n=5;n>0;n--)); do sleep 1 && echo "Starting in $n"; done
rm -f $TMPFILE

cd $OUTDIR
i=0
while ( /bin/true ); do {
NUM=$(printf %04d $i)
i=$((i+1))
usleep 4000
xwd -id $WINID -out mov$NUM.xwd
}
done
eseguendo lo script viene chiesto di cliccare sulla finestra da registrare (il cursore diventa una "croce") e dopo 5 secondi dal click parte la registrazione. Vengono creati tutta una serie di file temporanei di tipo xwd, ciascuno dei quali contiene un frame del filmato. A questo punto possiamo convertirli in jpeg ponendoci nella directory nella quale sono stati generati e usando il seguente comando (per usare convert bisogna aver installato imagemagick)

find mov*.xwd -type f -exec basename '{}' .xwd ';' | xargs -L1 -I{} convert {}.xwd {}.jpg

(occorre un po' di tempo per la conversione, a seconda del numero di frame da convertire)
e incollare le jpg in un unico filmato utilizzando Mencoder (fornito con mplayer)

mencoder "mf://*.jpg" -mf fps=25 -o output.avi -ovc lavc -lavcopts vcodec=mpeg4

et voilą, abbiamo ottenuto il filmato desiderato.
Unica difficoltą riscontrata, ma credo sia un problema legato al programma che stavo utilizzando (DosBox), vi sono dei frame "vuoti" che vengono generati occasionalmente, e vanno eliminati prima di assemblare il filmato. Identificarli č facile, sono i file di dimensione pił piccola tra quelli che abbiamo ottenuto, e hanno sempre la stessa dimensione.


usleep.c source code
Codice:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {
int stime;
stime=atoi(argv[1]);
usleep(stime);
return 0;
}
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrįs vivo de ella”

Ultima modifica di gurutech : 07-11-2009 alle 13:30.
gurutech č offline   Rispondi citando il messaggio o parte di esso