Screencast Perfetto di una singola finestra con FFmpeg

 

Il titolo di questo post inizia con "Screencast Perfetto", e magari ad alcuni potrà sembrare un tantino esagerato, ma secondo me non lo è affatto. In Gnu/Linux esistono diversi programmi per fare uno screencast, ne cito uno per tutti, RecordmyDektop, anche se io ho sempre preferito utilizzare FFmpeg, Quello che ho notato in tutti i programmi è la "difficoltà" di centrare la finestra o il terminale in maniera precisa, certo nulla di grave, basta mettersi lì e perdere un pò di tempo per trovare il rettangolo perfetto. Però finalmente io ho trovato la soluzione che mi soddisfa completamente, e questo grazie a FFmpeg, che io amo molto, tanto è vero che gli ho dedicato una categoria esclusiva 🙂 Comunque andando al sodo la soluzione è la seguente:

$ xwininfo

digitando nel terminale xwininfo e successivamente toccando una finestra, avremo a disposizione molte informazioni:

xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0x2424585 (has no name)

  Absolute upper-left X:  274
  Absolute upper-left Y:  219
  Relative upper-left X:  274
  Relative upper-left Y:  219
  Width: 654
  Height: 439
  Depth: 0
  Visual: 0x21
  Visual Class: TrueColor
  Border width: 0
  Class: InputOnly
  Colormap: 0x0 (not installed)
  Bit Gravity State: ForgetGravity
  Window Gravity State: NorthWestGravity
  Backing Store State: NotUseful
  Save Under State: no
  Map State: IsViewable
  Override Redirect State: yes
  Corners:  +274+219  -352+219  -352-366  +274-366
  -geometry 654×439+274+219
 

io ho preso queste informazioni toccando la finestra che mi interessava, e come si può vedere ci sono molti dati utili, tra cui il posizionamento-Corners-geometry. Adesso non bisogna fare altro che darle in pasto a FFmpeg. Quindi per prima cosa bisogna creare lo script record.sh, ed incollarci dentro:

 

#!/bin/sh

INFO=$(xwininfo -frame)

WIN_GEO=$(echo $INFO | grep -oEe 'geometry [0-9]+x[0-9]+' | grep -oEe '[0-9]+x[0-9]+')
WIN_XY=$(echo $INFO | grep -oEe 'Corners:\s+\+[0-9]+\+[0-9]+' | grep -oEe '[0-9]+\+[0-9]+' | sed -e 's/\+/,/' )

ffmpeg -f x11grab -r 25 -b 2000k -s $WIN_GEO -i :0.0+$WIN_XY /tmp/screencast.avi

 

in caso di problemi di formattazione si può scaricare da quà:

settare i permessi:

$ chmod +x record.sh

e lanciare:

$ ./record.sh

adesso non dobbiamo fare altro che toccare la finestra da registrare e lo script si occuperà in automatico della posizione precisa, salvando lo screencast in /tmp. Attenzione: per registrare il terminale bisogna toccare la barra della finestra, altrimente lo script non riesce a determinare l'esatta posizione, non so il motivo, per quanto riguarda tutto il resto, basta cliccare in un punto qualsiasi delle finestre.

FFmpeg ti amo!!!

enjoy 😉

Autore: Franco Conidi aka edmond

Senior System Integrator, Network Administrator, Sys Admin Linux, Linux User, Consulente Informatico.

29 pensieri riguardo “Screencast Perfetto di una singola finestra con FFmpeg”

  1. Con questo articolo ho già in mente qualche idea per il blog 🙂

  2. FFMpeg piace tantissimo anche a me, quindi conservo sempre i tuoi post sul tema.

    Ho notato che la grandezza della finestra la prendi da geometry, come mai non usi Width e Height? Genarlmente sono uguali, ma a volte le approssimazioni di geometry non sono precise.

  3. p, li { white-space: pre-wrap; }

    Sto provando, ma quando vado a riprodurre esce l'errorer di seguito, e non visualizza niente, ma la barra di progresso scorre.
    "Your video output acceleration driver does not support the required resolution: 673×522 pixels. The maximum supported resolution is 674×522.

    p, li { white-space: pre-wrap; }

    Video output acceleration will be disabled. However, rendering videos with overly large resolution may cause severe performance degration."

  4. [Edit]
    Con Totem si visualizza alla perfezione, il problema lo da Vlc. Davvero ottimo.
    Lo proverò su Arch e Slackware.
    Fortuna ci sei tu, ci fai molto lavoro "sporco". 😉

  5. @deer

    è un errore strano, non mi è mai capitato. L'errore parla di risoluzione e rendering video, prova a fare lo screencast solo da terminale, per vedere se ti dà lo stesso errore.

  6. Si il problema è il rendering, e l'accellerazione, ho provato a cambiare dei settaggi in Vlc qualcosa si visualizza ma malamente. Ripeto con Totem è ok.

  7. @lightuono

    che tipo di idea….confidati…che te la rubo 🙂

    @Idl3

    ho usato geometry per una questione di comodità, ed al momento non ho riscontrato

    problemi con la posizione delle finestre, nel caso qualcosa non funzionasse bene si può

    sempre fare delle modifiche

    @deer

    con ffmpeg a volte ti devi sporcare le mani, ma i risultati sono sempre i migliori 😉

  8. Ciao,
    Davvero complimeti per la guida, utilissima e semplice!!
    L'unica cosa che ho dovuto cambiare è s iniziale in Corners:s++[0-9]++[0-9]+'
    Per il resto funziona benissimo!

  9. @edmond: mi son permesso di modificare il tuo script per farlo piu' incasinato 🙂 ora i dati va a prenderli con grep e awk (la qual cosa mi soddisfa), e non piu' da geometry e corners (cosa che come scritto nel mio commento precedente non mi piaceva molto).  Vabbe', condivido la mia inutile modifica https://pastebin.com/3dHR0CaM

  10. Provato su Arch, funziona anche con Vlc,  su Slackware (qui non ho Vlc)  funziona, solamente che su tutte e due vengono leggermente sgranati, ma visibili bene.

  11. @deer
    Per migliorare la qualità inserisci -b 2000k nella stringa di ffmpeg dopo -r 25. Credo che in questo modo i video vengono meno sgranati.

  12. @c2asr
    Ottimo, adesso si che si ragiona, posso dire anche io "perfetto".
    Grazie

  13. @deer

    assolutamente no…..stavo commentandolo oggi, ma hai qualche problema

    perchè viene fuori l'errore seguente: "Error: Wrong anti-spam word"

  14.  cacchio, non ne sapevo nulla.
    Ho provato a autopostarmi e funziona. Ho letto però che il problema potrebbe darlo il plugin del cryptographp con il captcha, che ora ho disattivato, potresti farmi una prova?
    grazie 

  15. Ciao Edmond:
    Ti disturbo perche non riesco a far girare il tuo script (e nemmeno quello di c2asr) mi da sempre questo errore
    <code>
    FFmpeg version SVN-r0.5.1-4:0.5.1-1ubuntu1, Copyright (c) 2000-2009 Fabrice Bellard, et al.
      configuration: –extra-version=4:0.5.1-1ubuntu1 –prefix=/usr –enable-avfilter –enable-avfilter-lavf –enable-vdpau –enable-bzlib –enable-libgsm –enable-libschroedinger –enable-libspeex –enable-libtheora –enable-libvorbis –enable-pthreads –enable-zlib –disable-stripping –disable-vhook –enable-runtime-cpudetect –enable-gpl –enable-postproc –enable-swscale –enable-x11grab –enable-libdc1394 –enable-shared –disable-static
      libavutil     49.15. 0 / 49.15. 0
      libavcodec    52.20. 1 / 52.20. 1
      libavformat   52.31. 0 / 52.31. 0
      libavdevice   52. 1. 0 / 52. 1. 0
      libavfilter    0. 4. 0 /  0. 4. 0
      libswscale     0. 7. 1 /  0. 7. 1
      libpostproc   51. 2. 0 / 51. 2. 0
      built on Mar  4 2010 12:35:30, gcc: 4.4.3
    Frame size must be a multiple of 2
    sh: Syntax error: "(" unexpected
    </code>
    So che non è problema dello script (o almeno credo) ma non saprei cosa dovrei fare per rimediare, Avresti qualche idea da dove cominciare?
    Grazie

  16. @bersil
    Ciao controllo bene che le parentesi tonde siano sia aperte che chiuse e nella linea fi ffmpeg cambia -r 25 con -r 2.
    Spero di averti aiutato!

  17. infatti il problema dovrebbe essere in un errore nella formattazione del testo,

    controlla meglio!!!

  18. Ciao Edmond:
    grazie per la risposta.
    Allora: il problema persiste sulla mia kubuntu 10.04 ma, l'ho fatto girare su una Ubuntu 10.10 virtualizzata e va benissimo quindi, come pensavo, lo script è giusto. Nella rete non sono riuscito a trovare nulla che mi possa aiutare, continuerò le ricerche e se risolvo ti farò sapere gia che avevo voglia di creare un DEB per renderlo installabile come una applicazione (e non come parte degli script nautilus) per far sì che altri come me che hanno un file manager diverso lo possano sfruttare.

    Grazie ancora e a presto

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *