Time lapse video con ffmpeg, mencoder e imagemagick

E’ diffusa l’opinione che per fare video editing professionale servano computer molto potenti e software costosi.

E’ fuor di dubbio che software ad hoc semplificano di molto la vita a chi ha la necessità di produrre video in quantità e in tempi brevi, ma in genere questi software sono prodotti complessi, imparare ad utilizzarli e conoscere tutti i loro trucchi richiede del tempo e talvolta chi li usa per la prima volta o sporadicamente incontra delle difficoltà per fare delle cose all’apparenza banali.

Per quanto poi possa essere completo un programma di video editing, ci sarà sempre qualcosa che non si potrà fare, oppure per farla occorrerà scrivere “estensioni” o “plug in”.

Per questo, dopo aver perso un paio di giorni ad installare e provare ad utilizzare vari software di video editing, ho deciso di utilizzare i classici (per chi li conosce) programmi open source ffmpeg, mencoder, imagemagick per fare un semplice video clip con la mia Linux Box.

In poco tempo sono riuscito a fare quello che volevo, cioè prendere un file avi, estrarre due frame ogni secondo per ottenere un effetto accelerato, applicare dei filtri per migliorare l’immagine, aggiungere delle scritte in sovraimpressione, aggiungere una traccia audio e creare un file flv, fruibile con un playerino flash via web.

La ricetta:
Il primo passo è convertire il file originale in una serie di immagini, per questo ho utilizzato ffmpeg.

$ mkdir frames
$ ffmpeg -i <file.avi>  -y -an -sameq -f image2 -r 2/1 frames/%08d.jpg
$ cp -r frames frames1

Il comando scompone il file video di ingresso nelle varie immagini che lo compongono, prelevandone 2 ogni secondo e copiandole nella directory “frames”

Il secondo passo è quello di generare dei testi che ruotano.
Per questo ho scritto uno script python, “edit.py” che utilizza “convert” per sovraimporre i testi su alcune immagini.

import subprocess
parameters=((0,60,90,"START"),
  (270,554,50,"viadotto Giubileo del 2000"),
  (567,1290,70,"via Flaminia"),
  (1300,1742,70,"corso Francia"),
  (2716,2800,60,"corso Rinascimento"),
  (3792,4100,50,"via Cristoforo Colombo"),
    )
def do():
  global parameters
  for i in range (1,4199):
  #for i in range (1,50):
    wtd=False
    for parameter in parameters:
      start,end,pointsize,s = parameter
      if i>=start and i<=end:
        wtd=s
        rot = (i-start)*3
        break

    if wtd:
      src="frames/%.8d.jpg" % (i)
      dest="frames1/%.8d.jpg" % (i)
      draw = "rotate %s gravity Center text 0,0 "%s"" % (rot,wtd)
      subprocess.call (["convert",src,"-fill","red","-pointsize",str(pointsize),"-draw",draw,dest])

if __name__ == "__main__":
  do()

Una volta generati i frames con le scritte occorre soltanto riassemblarli.
Per questo, dopo aver fatto girare "edit.py", ho utilizzato mencoder.

$ python edit.py
$ mencoder "mf://frames1/*.jpg"  -audiofile audio.ogg -o output.flv -ofps 30 \
-vf eq=15:0,denoise3d,spp=6,scale=320:240 -of lavf \
-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -ovc lavc \
-lavcopts vcodec=flv:vbitrate=640:mbd=2:mv0:trell:v4mv:cbp:last_pred=3  \
-oac mp3lame -lameopts br=64 -srate 22050 -af lavcresample=22050

Il risultato è un video accelerato o "time lapse".
I vari parametri dati a mencoder servono per selezionare il codec flv, impostare una serie di filtri per migliorare l'immagine, selezionare il formato audio di uscita, specificare quali sono le sorgenti di ingresso e il file di uscita.

Il consiglio, se volete approfondire l'argomento, è quello di leggere con attenzione la documentazione e di sperimentare in pratica i vari parametri.

Tanto per fare un esempio, questo comando produce un file mpeg4 a partire dalle immagini contenute nella directory frames1

$ mencoder "mf://frames1/*.jpg"  -ovc lavc \
-lavcopts vcodec=mpeg4:mbd=1:vbitrate=1800 \
-o output.avi  -oac copy -audiofile audiofile.mp3

Ad ogni modo, nel caso del file flv, il risultato è questo:

Per la cronaca, il file dal quale sono partito è stato fatto con la Action Cam ATC2K.