Le miniguide di UbaWeb

Screencast e conversione video in gif animata via terminale

Premessa Torna su

16 marzo 2013 - Linux 3.2.0-39-generic -Ubuntu i686 GNU/Linux - All'inizio dello studio dello scripting di Bash mi feci qualche script di animazione con caratteri ASCII su terminale, due li avevo anche pubblicati su "Le bischerate di UbaWeb" e sono: un'omino e una supermucca. Tornato su quelle vecchie pagine ho pensato di cambiare l'immagine statica dell'omino con il risultato dello script in formato gif animata.
Ho scoperto che i comandi (ffmpeg), che usavo in passato per catturae lo schermo in un video, sono deprecati a favore di avconv e allora ho deciso di fare una miniguida.

Il procedimento Torna su

Visto che si deve catturare un'area dello schermo limitata all'animazione nel terminale, si deve fare in modo di "localizzare" e trovare le dimensioni di quest'area sullo schermo.
Il metodo più semplice è salvarsi uno screenshot dello schermo (tasto Stamp o la combinazione Alt+Stamp, vedere anche questa e questa pagina) mentre è in esecuzione lo script. Aprire il file della schermata con Gimp e misurare lo spazio orizzontale e verticale da cui deve iniziare l'area che verrà catturata e l'area effettivamente utile che sarà catturata.
Nel mio caso l'angolo sinistro dell'area utile è 4px a destra e 110px in basso (corrisponde all'angolo superiore sinistro dell'area da catturare), l'area utile è di 155px per 100px.



Ottenuti questi dati si può far partire la cattura dello schermo impostando una riga di questo genere:

avconv -f x11grab -s 155X100 -r 10 -i :0.0+4,110 /tmp/out.avi

Premendo Invio parte la cattura dell'area individuata da -i :0.0+4,110 dove:
:0.0 è il display interessato, verificabile con echo $DISPLAY,
l'angolo da cui inizia l'area della cattura è individuato da +4,110 4px a destra e 110px in basso,
l'area totale da registrare è dichiarata con -s 155X100
il frame rate in fotogrammi al secondo è impostato a a 10fps mediante -r 10
alla fine della riga /tmp/out.avi c'è il percorso in cui sarà salvato e il nome del file video,
-f x11grab indica la cattura su X11.
Per fermare la cattura si premono i tasti Ctrl+c.

Ottenuto il file video out.avi si può procedere in due modi:

Utilizzare mplayer, che mediante una riga di codice, crea direttamente la gif animata...
oppure...
Si creano i singoli frame e da questi si crea la gif animata.

Conviene utilizzare il primo metodo se il file video è già come vorremmo la gif finale.
Conviene utilizzare il secondo metodo se ci sono frame del video che si devono eliminare o modificare.

Primo metodo: Occorre aver installato Mplayer (sudo apt-get install mplayer).
Per ottenere direttamente la gif animata, basta eseguire la riga di codice, che segue, nel terminale (lanciato dalla directory in cui si trova il filmato).

mplayer out.avi -ss 00:00:00.000 -endpos 00:00:12.000 -vf scale=155:100 -vo gif89a:fps=10:output=out.gif -nosound

Ho lasciato scale=155:100 e -nosound per far vedere che è possibile ridimensionare i frame ed eliminare l'audio se presente.

out.avi è il file video da elaborare,
-ss 00:00:00.000 -endpos 00:00:12.000 indicano i punti da cui iniziare e terminare la creazione dei frame in hh:mm:ss.xxx (ore:minuti:secondi.millesimi_di_secondo), nel mio caso dall'inizio per 12 secondi
-vf scale=155:100 ridimensiona i frame,
-vo gif89a formato di uscita per gif animata,
fps=10 10 fotogrammi al secondo,
output=out.gif nome del file in uscita.

Questo metodo, generalmente, crea gif animate di qualità inferiore rispetto al metodo che segue (che però è più lento).

Metodo alternativo Torna su

Secondo metodo. Prima si creano i frame con il comando:
ffmpeg -i out.avi img/frame_%04d.png
In questo caso vengono creati i singoli frame nella dir "img" (Attenzione! La directory corrente "img" deve esistere), i file verranno creati con nomi del tipo "frame_0001.png", frame_0002.png", ...frame_nnnn.png.
(Si può usare anche avconv -i out.avi img/frame_%04d.png)

Creati i frame si possono eliminare quelli non necessari, per esempio: quelli all'inizio e/o alla fine.

Fatto questo si crea la gif animata eseguendo la riga che segue nel terminale:
convert -delay 10 img/frame_*.png omino.gif
(la conversione può richiedere parecchio tempo, ma è di qualità superiore).
convert è uno strumento di ImageMagick, -delay indica il ritardo tra un frame e l'altro in centesimi di secondo, per il resto non credo ci sia bisogno di spiegazioni.
Fatto!

E se no? Torna su

Se si vuole fare tutto in un unico passaggio c'è Byzanz che fa lo screencast direttamente in gif (si possono scegliere anche altri formati video: ogg, flv, byzanz).
Non mi metto a spiegare il funzionamento, capiti i procedimenti già descritti basta leggere man byzanz-record per poterlo utilizzare.
Per installarlo conviene abilitare i repo:

sudo add-apt-repository ppa:fossfreedom/byzanz sudo apt-get update && sudo apt-get install byzanz
un esempio di utilizzo:

byzanz-record --duration=10 --x=20 --y=100 --width=320 --height=240 animaz.gif

Intuitivo vero?!

Nota finale: I metodi descritti vanno bene nella maggior parte dei casi, se si vuole ottenere una qualità ancora superiore conviene fare la conversione dei frame in gif animata utilizzando Gimp con installato gimp-gap (sudo apt-get install gimp-gap).
Sapete usare Gimp vero? Qualsiasi linuxiano che si occupa di grafica dovrebbe saper usare: Gimp, Inkscape, Scribus e almeno cominciare a studiare Blender (cominciare perché non si finisce mai di imparare. Blender non è solo per il 3D ma permette di fare qualsiasi cosa, come: animazioni, audio-video (montaggio, conversioni ed elaborazioni), simulazioni fisiche, interfacce grafiche, giochi (3D, anche con prospettiva 2D) e, con l'aiuto di Python... di tutto di più.



Bye 8-)

Torna su
Sito realizzato da: UbaWeb di Giovanni Ubaldi

Licenza Creative Commons Tutto il contenuto di questo sito se non diversamente dichiarato è di Giovanni Ubaldi ed è distribuito con Licenza:

Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale.