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 ๐Ÿ˜‰

Registrare audio mp3 con alsa ed ffmpeg

 

 

Anche questa volta ho avuto bisogno di ffmpeg e devo dire che non mi ha deluso. Bene, la situazione è abbastanza semplice, avevo bisogno di registrarmi nella lettura di un pdf, dove all'interno ci sono delle nozioni, che da autodidatta sto studiando, ma dato che il tempo per farlo dentro casa è poco, l'idea era quella di leggere e registrare questo corso in un cd per poterlo portare con me al lavoro. Quello che ho fatto è stato collegare il microfono, identificare il device con:

$ arecord -l

e quindi avviare ffmpeg:

$ ffmpeg -f alsa -ac 2 -i hw:0,0 -acodec libmp3lame -ab 96k file.mp3

enjoy ๐Ÿ˜‰

Xdpyinfo utility per X con ffmpeg

 

 

 

 

 

Xdpyinfo è un utility che serve a visualizzare informazioni sul server X, e quindi si può anche usare per conoscere l'esatta risoluzione del nostro schermo e successivamente abbinarlo con ffmpeg per effettuare uno screencast,argomento questo che mi appassiona ed ho già affrontato nei Top 20 comandi per ffmpeg. Per conoscere la risoluzione:

$ xdpyinfo | grep 'dimensions:'|awk '{print $2}'

per lo screencast:

$ ffmpeg -f x11grab -s `xdpyinfo | grep 'dimensions:'|awk '{print $2}'` -r 30 -i :0.0 -sameq /tmp/screencast.mpg

Top 20 comandi per ffmpeg

 

 

Per correttezza preciso che sono i miei Top 20 comandi ๐Ÿ™‚ Io sono un utilizzatore assiduo di ffmpeg ed ho pensato di mettere nero su bianco i comandi che uso frequentemente, del resto credo di non essere il solo a cui piace usare prevalentemente la shell. Inizio con il menzionare alcuni comandi semplicissimi per poi successivamente passare ad alcuni più complessi, come al solito il punto di partenza da consultare è sempre il man o il web ๐Ÿ™‚ La base da cui partire, anche se sembra banale è la conoscenza dei formati e dei codec, quindi:

Base:

ffmpeg -formats

ffmpeg -codecs

Video:

per ottenere info su un video:

ffmpeg -i video.avi

convertire da .avi a .mpg e viceversa:

ffmpeg -i input.avi output.mpg

convertire da .avi a .flv:

ffmpeg -i input.avi -sameq -ar 44100 output.flv

convertire da .flv a .mpg:

ffmpeg -i input.flv -sameq -ab 56k -ar 22050 -b 500 -s 640x480 output.mpg

convertire da .avi a .mpeg per lettori dvd:

ffmpeg -i input.avi -target pal-dvd -ps 2000000000 -aspect 16:9 output.mpeg

tagliare una sequenza video, dove -ss rappresenta il tempo d'inizio e t la fine:

ffmpeg -vcodec copy -acodec copy -i input.avi -ss 00:00:30 -t 0:0:15 output.avi

convertire video per ipod/iphone:

ffmpeg -i input.flv -acodec libfaac -ab 96k -ac 2 -vcodec libx264 -vpre hq -vpre ipod320 -threads 0 -crf 22 output.mp4

Audio:

estrarre suono da un video e convertirlo in mp3:

ffmpeg -i input.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 output.mp3

cancellare suono da un video:

ffmpeg -i input.avi -an -b 1200 output.avi

aggiungere suono ad un video:

ffmpeg -i input.wav -i input.avi output.mpg

convertire da wav a mp3:

ffmpeg -i input.wav -ab 128 output.mp3

Immagini:

convertire un video in una sequenza di immagini:

ffmpeg -i input.flv -an -r 1 -y -s 320x240 video%d.jpg

estrarre immagine da una sequenza prestabilita:

ffmpeg -i input.flv -an -ss 00:00:25 -t 00:00:01 -r 1 -y video%d.jpg

Screencast:

ffmpeg -f x11grab -s 1280x1024 -r 30 -i :0.0 /tmp/screencast.mpg

oppure:

ffmpeg -y -t 60 -r 25 -s 1280x1024 -f x11grab -i :0.0 screencast.avi

screencast utilizzando un microfono + oss:

ffmpeg -s 1280x1024 -r 25 -f x11grab -i :0.0 -f oss -i /dev/dsp screen.avi

screencast utilizzando un microfono + arecord:

arecord -D default -t raw -c 1 -f S16_LE -r 48000 - | ffmpeg -f s16le -ab 128k -ar 48000 -ac 1 -i --acodec mp2 -f x11grab -r 2 -s 1280x1024 -i :0.0 -vcodec mpeg4 screen.avi

screencast prendendo il suono direttamente da  un file mp3:

ffmpeg -f x11grab -s 1280x1024 -r 30 -i :0.0 -i percorso_del_file.mp3 -ar 22050 -ac 1 -acodec mp2 -ab 128k screen.avi

Questi sono i miei Top 20 comandi per ffmpeg, messi nero su bianco sperando di fare contento qualcun'altro ๐Ÿ˜‰ e sopratutto spero che qualcuno ne posti di altri, poichè sono molto interessato ๐Ÿ™‚

Screencast da shell completo

 

Ed eccoci alla fine della trilogia dello Screencast, trilogia non voluta dato che quando ho iniziato a fare la prima guida, non pensavo certo di continuare, ma poi c'è stata la seconda guida ed adesso la terza ed ultima. Il filo conduttore di queste guide è sostanzialmente lo stesso e cioè si  continua sempre parlando dello Screencast usando il terminale, quindi niente gui, diciamo un sistema per quei piccoli esseri immortali come me. Come sempre quando si fa o si scrive una cosa, il risultato migliore lo si ottiene quando ci si confronta e ci si stimola a vicenda, e questo è quello che è successo con un mio lettore, deer , che ha contribuito alla nascita di questo post, come si può evincere dai commenti nei post precedenti e che ringrazio. A questo punto iniziamo a parlare di come fare uno Screencast completo on the fly. Quello che ci serve è questo script dopo:

chmod a+x recordSoundAndDesktop.sh

./recordSoundAndDesktop.sh

Questo script non fa altro che catturare il video in .avi e successivamente convertire il file .wav creato da arecord in .mp3, il tutto in maniera velocissima. Dato che siamo in argomento voglio citare anche la possibilità di fare uno screencast utilizzando l'audio direttamente da un file. Il comando è il seguente:

ffmpeg -f x11grab -s 1280x1024 -r 30 -i :0.0 -i percorso_del_file.mp3 -ar 22050 -ac 1 -acodec mp2 -ab 128k screen.avi

Altri screecast fatti da me e deer con questo script.

Screencast da shell con audio

 

Qualche tempo fa avevo scritto su come fare uno screencast da shell, ma non avevo accennato alla possibilità di farlo registrando contemporaneamente da un microfono e quindi molto utile per chi volesse fare delle guide. L'idea mi è stata data da un lettore, che ringrazio, e che mi chiedeva appunto se esisteva un unico comando per uno screencast audio-video. Dico subito che ho trovato delle difficoltà nel trovare una soluzione ottimale, poichè usando principalmente Debian testing e Sid, succede che a volte (spesso) quello che hai sperimentato il giorno prima ed era funzionante, il giorno dopo ti da problemi o non funziona. Tuttavia questa volta ho sperimentato il tutto anche su Ubuntu 9.10 che ho installato ieri sera, solo perchè volevo togliermi delle curiosità, del resto la mia ultima frequentazione di Ubuntu risale alla versione 8.4. Di seguito i comandi che mi hanno soddisfatto:

Utilizzando ffmpeg con oss:

ffmpeg -s 1280x1024 -r 25 -f x11grab -i :0.0 -f oss -i /dev/dsp screen.avi

Utilizzando ffmpeg con arecord:

arecord -D default -t raw -c 1 -f S16_LE -r 48000 - | ffmpeg -f s16le -ab 128k -ar 48000 -ac 1 -i - -acodec mp2 -f x11grab -r 2 -s 1280x1024 -i :0.0 -vcodec mpeg4 screen.avi

Ricordarsi di settare in: preferenze dell'audio-ingresso-connettori il proprio microfono. Per ulteriori informazioni ed opzioni guardare qua e qua oltre che ai man.

Screencast da shell personalizzato

 

Per ottenere uno screencast con Linux esiste un ottimo programma come gtk-recordMyDesktop, che non è niente altro che un fronted per recordMyDesktop. Lo screencast alla fine viene esportato come formato .ogg. Un altro metodo, secondo me migliore poichè largamente personalizzabile è quello di usare ffmpeg, con il seguente comando:

ffmpeg -f x11grab -s 1280x1024 -r 30 -i :0.0 /home/UTENTE/Desktop/screencast.mpg

alla fine basta premere q per terminare.

In questo esempio come risoluzione io ho usato 1280x1024, e come formato finale .mpg., ma si può scegliere una risoluzione diversa e soprattutto di esportare in formato differente, a secondo della nostra esigenza.

Aggiornamento:

Un altro comando utile in alternativa può essere questo:

ffmpeg -y -t 60 -r 25 -s 1280x1024 -f x11grab -i :0.0 screen.avi