Screencast audio-video ad alta qualità con FFmpeg

 

Ed eccomi ancora quà con l'ennesima guida su FFmpeg, sì lo sò, sono fissato, ma come sapete è uno dei tools che amo di più, per questo ho deciso di scrivere il più possibile su ogni esperimento che faccio, sia per quanto riguarda l'utilizzo dello screencast, sia per quanto riguarda le opzioni di conversione in generale. Ho già dedicato diversi post allo screencast con FFmpeg, ma adesso ho voluto farne uno cercando la migliore qualità audio/video possibile. La base di partenza è sempre lo script record.sh del post precedente, ma modificato per migliorare sensibilmente la qualità dello screencast:

 

#!/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 alsa -ac 2 -i hw:0,0 -f x11grab -r 30 -s $WIN_GEO -i :0.0+$WIN_XY -acodec pcm_s16le -vcodec libx264 \
-vpre lossless_ultrafast -threads 0 -y screencast.mkv

 

per chi usa PulseAudio, sostituire:

 

-f alsa -ac 2 -i hw:0,0

con:

-f alsa -ac 2 -i pulse

 

c'è da dire che questa soluzione ha il "difetto" di creare screencast di grosse dimensioni, quindi nel caso di upload su youtube bisogna prepararsi all'ottimizzazione, cercando sempre di mantenere lo standard alto. Quindi il comando seguente oltre ad ottimizzare il file per youtube, ne riduce sensibilmente le dimensioni:

 

 

quello sopra anche se lunghino è un solo comando. Credo che il tutto sia ancora migliorabile, dato che ho notato delle piccole imperfezioni.

 

ps: il video sopra è volutamente muto.

 

enjoy 😉

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 😉

Inserire logo in un video con FFmpeg

 

Un pò di tempo fa c'era la possibilità di inserire un logo in un video con FFmpeg usando vhook, ma ho scoperto che adesso questo non è più possibile, o meglio, non è più possibile con vhook, ma si può fare lo stesso usando Soc e libavfilter, infatti nel mio post precedente, ho parlato di come installare FFmpeg da sorgenti, appunto per poter compilare ed utilizzare queste librerie. Diciamo che la possibilità di inserire un logo in un video può essere molto utile, specialmente per chi vuole marchiare i propri video per renderli unici, non proprio come il mio dove ho inserito tux-sioux gigante 🙂

Ed ecco di seguito un' altro dei comandi magici:

$ ffmpeg -i video.avi  -vf "movie=0:png:immagine.png [logo]; [in][logo] overlay=10:10:1" output.avi

ps: per chi è pigro ed interessato a limite inserirò i pacchetti ffmpeg e x264 nel mio repository.

ps: la "cosa mancante" del post precedente è –enable-filter=movie

enjoy 😉

Building FFmpeg su Debian Squeeze con libavfilter e x264

 

Ho scoperto da poco che nell'installazione di default di ffmpeg, manca qualcosa, e che proprio questa cosa che manca ,mi serve per un "esperimento". Comunque andando per ordine e tralasciando a cosa mi serve la  "cosa mancante" ,ho deciso di compilare ffmpeg ex novo, con il supporto x264 e libavfilter. Quindi come primo procedimento ho disinstallato la versione installata dai repo.

 

# apt-get remove ffmpeg x264 libx264-dev

 

dopo di chè ho installato tutto quello che serve per una corretta compilazione:

 

# apt-get build-dep ffmpeg

 

servono anche:

 

# apt-get install build-essential subversion git-core checkinstall yasm texi2html libfaac-dev libfaad-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libx11-dev libxfixes-dev libxvidcore4-dev zlib1g-dev

 

Scaricare compilare ed installare  soc x264 e ffmpeg:

 

$ svn co svn://svn.ffmpeg.org/soc

$ cd soc/libavfilter

$ ./checkout.sh

$ cd ffmpeg

$ ./configure --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libx264 --enable-libxvid --enable-x11grab --enable-libtheora --enable-libgsm --enable-libvorbis --enable-filter=movie --enable-avfilter --enable-postproc

$ make

 

con ERROR: libx264 not found, oppue senza, bisogna installare x264:

 

$ cd ../../..

$ git clone git://git.videolan.org/x264.git

$ cd x264

$ ./configure

$ make

# checkinstall --fstrans=no --install=yes --pkgname=x264 --pkgversion "1:0.svn`date +%Y%m%d`-squeeze" --backup=no --default

 

tornare nella cartella di ffmpeg:

 

$ cd ../soc/libavfilter/ffmpeg

$ ./configure --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libx264 --enable-libxvid --enable-x11grab --enable-libtheora --enable-libgsm --enable-libvorbis --enable-filter=movie --enable-avfilter --enable-postproc

$ make

# checkinstall --pkgname=ffmpeg --pkgversion "5:0.7+svn`date +%Y%m%d`" --backup=no --default

 

adesso abbiamo una nuova installazione di ffmpeg con quel qualcosa che mi mancava, ma di cui scriverò la prossima volta 🙂

 

enjoy 😉

Avconverter nautilus-script per audio/video/immagini/text/iso

 

 

 

 

 

 

 

Avconverter a mio modesto parere è uno script eccezzionale, perchè ti mette in condizione di avere a portata di clik tutti i formati di conversione. Uno dei tanti motivi per cui anni fa scelsi di passare a Gnu/Linux fu proprio la grande libertà di personalizzazione della propria box, e questo script è proprio la dimostrazione pratica di customizzazione e potenza di un sistema unix 🙂  Avconverter si appoggia inoltre ad ffmpeg ed imagemagick, quindi è in grado di fare qualunque conversione sia audio/video che di immagini, poi addirittura sfruttando espeak converte da text a sound (come si può sentire nell'audio sopra). Credo che qualche problema ci sia invece per quanto riguarda le iso. Tutte le opzioni sono facilmente configurabili  grazie a zenity che ci mostra delle finestre di dialogo.  Comunque consiglio di provarlo.

Requisiti obbligatori e non:
 

# apt-get install xterm zenity ffmpeg imagemagick mencoder links espeak

# apt-get install gawk antiword odt2txt odt2txt nrg2iso daa2iso uif2iso acetoneiso
 

Installazione avconverter:
 

$ wget https://gnomefiles.org/CONTENT/content-files/92533-avconvert.tar.gz

$ tar -zxvf 92533-avconvert.tar.gz

$ cp avconvert ~/.gnome2/nautilus-scripts
 

a questo punto non ci resta che posizionarci su un file audio/video/immagine/testo e fare click destro ed avviare Script/avconverter.

enjoi 😉
 

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 😉

Inserire audio in immagine statica con ffmpeg

 

 

 

 

 

 

 

Mi sono trovato nella situazione di voler inserire in una singola immagine una musica, e quindi come al solito senza pensarci troppo mi sono rivoltto a ffmpeg. La "difficoltà " sta nel fatto che essendo una singola immagine e volendo inserire una musica che dura 3 minuti, mi sono trovato di fronte al problema di ripetere l'immagine per gli stessi minuti dell'audio. Ho provato il tutto con un file.ogg ed un immagine.jpg, ma chiaramente funziona anche con altri formati. Le opzioni che ho usato sono le seguenti:

 

$ ffmpeg -i file.ogg -loop_input -f image2 -i file.jpg -t 188 file.avi

 

-loop_input:

indica di ripetere l'immagine in maniera indefinita.

-f image2 -i file.jpg:

indica di creare un video da un immagine statica .jpg

-t 188:

è la durata dell'audio in secondi che possiamo far coincidere con la fine del video.

enjoy 😉

Rallentare un video con ffmpeg e Sharon Stone

 

 

 

 

                                          Cocaine?  Have you ever fucked on cocaine, Nick?  It's nice!

 

Ci sono dei film che meritano di essere visti decine di  volte, e scene che meritano un approfondimento particolare, visto la difficoltà di afferrare alcuni particolari importanti 🙂 Comunque anche questa volta ci viene in aiuto FFMPEG, che utilizzeremo per rallentare il nostro video preferito:

# apt-get install ffmpeg mjpegtools

Per tagliare la sequenza che più m'interessava ho usato:

$ ffmpeg -vcodec copy -acodec copy -i Sharon_Stone.flv -ss 00:00:09 -t 0:0:16 file.flv

a questo punto bisogna rallentare i framerate, io da 30 li ho portati a 12, con questo comando:

$ ffmpeg -i file.flv -f yuv4mpegpipe - | yuvfps -s 12:1 -r 12:1 | ffmpeg -f yuv4mpegpipe -i  - -b 28800k  rallentato.flv

ed il risultato è questo:

 

 

con questo sistema si può anche velocizzare il video, basta aumentare i framerate.

 

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 🙂