Faceți căutări pe acest blog

sâmbătă, 8 octombrie 2011

Ffmpeg

 O aplicație CLI foarte utilă este ffmpeg. Talente? Capturi de ecran audio/ video, conversie fișiere audio/ video, extragere imagini din fișiere video, și altele din categoria multimedia.
 Subiectul este mult prea amplu, motiv pentru care vom vedea pe scurt cum se folosește ffmpeg pentru anumite sarcini.
 Util pentru începători este faptul că ffmpeg poate fi folosit fără parametri, ffmpeg asigurând implicit codecuri și tot ce mai trebuie.

 Completare: după ultimele actualizări ale ffmpeg (cel puțin in Arch Linux...), la orice comandă din cele ce urmează trebuie adăugat: -i :0.0, de exemplu ffmpeg -f x11grab -s 1280x960 -r 30 -b 6500 -bt 712k captura.avi va fi:
ffmpeg -f x11grab -s 1280x960 -i :0.0 -r 30 -b 6500 -bt 712k captura.avi.

 În primul rând: aplicațiile/ comenzile CLI NU sunt de speriat, NU trebuie neapărat reținute, NU trebuie neapărat scrise exact așa în consolă, este suficientă copierea lor (copy- paste) în consolă urmată de apăsarea tastei Enter, este utilă crearea de aliasuri ale comenzilor, aliasuri puse în ~/.bashrc (adică /home/user/.bashrc, se înlocuiește user cu numele corect al contului de user), ceva de genul (este o singură linie):
alias captura='ffmpeg -f alsa -ac 2 -i pulse -f x11grab -r 30 -s 1280x960 -i :0.0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -threads 0 captura.avi'
  Aliasul de mai sus realizează o captură audio/ video a desktopului meu, o salvează în directorul meu /home sub numele de captura.avi, și ce-i mai important eu nu scriu în consolă decât captura (și apoi apăs Enter), nu tot cârnațul de mai sus...



1- Captură audio/ video
 De exemplu pentru o captură de ecran audio/video putem folosi comanda simplistă:
ffmpeg -f x11grab -s 1280x960 -r 30 -b 6500 -bt 712k captura.avi   
Haideți să vedem cam ce reprezintă chestiiile astea obscure:
-f x11grab                            = sursa, desktopul
-s 1280x960                          = rezoluția dorită  (se înlocuiește cu cea folosită, iar dacă nu o știți, cu: $(xwininfo -root | grep 'geometry' | awk '{print $2;}'), de genul:
ffmpeg -f x11grab -s $(xwininfo -root | grep 'geometry' | awk '{print $2;}') -r 30 -b 6500 -bt 712k captura.avi  )
-r 30                                      = frame rate (implicit e 25)
-b 6500                                 = bitrate în kb
-bt 712k                                = toleranță la bitrate
-acodec ...                             = codec audio
-vcodec ...                               = codec video
-i :0.0                                    = poziția sursei de înregistrare, 0.0 fiind
 colțul stânga-sus (:0.0
 Sau putem rafina puțin comanda, adăugând anumiți parametri, opțiuni, codecuri, etc:
ffmpeg -f alsa -ac 2 -i pulse -f x11grab -r 30 -s 1280x960 -i :0.0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -threads 0 captura.avi
 Comanda se dă pe o singură linie, aici lipsa spațiului face să se întindă pe 2-3 linii...
 Pentru alegerea surse audio (intern/ sunet redat de o aplicație internă gen Mplayer, Audacious, Vlc, moc, Totem, etc. sau extern/ microfon) trebuie să instalăm pavucontrol (PulseAudio Volume Control) și în timp ce rulăm ffmpeg pornim pavucontol și alegem în tabul ”Recording” sursa audio.



2- Extragere audio sau video
Pentru extragere audio din fișier video (dintr-un videoclip să extragem doar partea audio, salvând-o ca .mp3):
ffmpeg - i fișier-video.avi -vn fișier-audio.mp3
 Înlocuiți fișier-video.avi cu numele corect al piesei (poate fi .avi, .mpg, .mpeg, .mp4, etc), fișier-audio.mp3 cu numele sub care salvați piesa, parametrul -vn spune ffmpeg să nu se ocupe de partea video.

 Pentru extragerea părții video (fără sonor) :
ffmpeg - i fișier-video.avi -an fișier-video.avi


3- Conversie audio/ video
Putem converti foarte simplu diverse formate de fișiere audio sau video:
ffmpeg -i sursă rezultat                 ceva de genul:
ffmpeg -i fișier-video.avi fișier-video.mp4
 Ffmpeg recunoaște/ lucrează cu majoritatea formatelor, oricum toate formatele cât de cât folosite...
 Folosesc comanda următoare pentru a-mi face video pentru telefon:
ffmpeg -i input.avi -s qcif -vcodec h263 -r 20 -b 180k -acodec libfaac -ab 64k -ac 2 -ar 22050 output.3gp
 Aflăm formatele disponibile cu ffmpeg -formats.


4- Redimensionare imagine
  Este posibil să schimbăm aspect ratio din 4:3 în 16:9 sau invers (ori să redimensionăm imaginea), tăind puțin din părtile de sus și jos (crop) sau adăugând benzi negre (pad), astfel încât imaginea să nu fie turtită pe verticală sau orizontală. Vom exemplifica cu un fișier video cu dimensiunile 1280x960 :
ffmpeg -i sursă -vf crop=lățime:înălțime rezultat                de exemplu:
ffmpeg -i video1.avi -vf crop=1280:900 video2.avi 
  Este posibil ca în această operație să schimbăm și formatul fișierului video din .avi în .mpg, ori .mp4, sau .flv, sau orice altceva. După cum puteți observa înălțimea a scăzut cu 60 de pixeli, 30 de sus, 30 de jos.
  În următorul exemplu vom mări puțin înălțimea, cu 40 de pixeli:...
ffmpeg -i sursă -vf  pad=lățime:înălțime rezultat
ffmpeg -i sursă -vf  pad=1280:1000 rezultat

 Uneori e posibil să dorim să micșorăm dimensiunile unui fișier video.
ffmpeg -i video-1.mpeg  -s lățimexînălțime video-2.mpeg
ffmpeg -i fireworks.mpeg  -s 200x150 fire.mpeg
 Sunt atribuite deja valori standard pentru dimensiuni (sqcif= 128x96, qcif= 176x144, etc, dacă dați într-o consolă comanda man ffmpeg veți afla toate valorile).
 Deci dacă dorim să redimensionăm un fișier video la 320x200 pixeli vom da comanda:
ffmpeg -i sursă.avi -s cga rezultat.avi

  


5- Lipire fișiere media
 Lipirea/ unirea fișierelor video este ușor de realizat, dar implică unii pași intermediari, asta din cauză că nu toate containerele video suportă așa ceva, noi vom folosi mpeg-1 sau mpeg-2. Deci mai întâi convertim fișierele noastre în .mpg.
ffmpeg -i video1.avi video1-int.mpg
ffmpeg -i video2.asf video2-int.mpg
cat video1-int.mpg video2-int.mpg > video.mpg
 Dacă dorim ca noul fișier rezultat din unirea celor două fișiere inițiale să aibă alt format îl putem converti:
ffmpeg -i video.mpg video.avi

 Pentru a înlocui sonorul unui fișier video cu altă sursă audio (.mp3 de exemplu):
ffmpeg -i fișier-video.flv  -i fișier-audio.mp3  -vcodec copy -acodec copy -map 0:0 -map 1:0 rezultat.flv


6- Tăiere fișiere media
 Exact cum putem lipi două sau mai multe fișiere putem și ”tăia”, extrage porțiuni dintr-un fișier, dar inițial trebuie convertit în .mpg, urmând ca după extragere să-l re- convertim dacă ținem neapărat:
ffmpeg -i video1.mpg -ss 00:01:00 -t 00:03:00 video2.mpg
 Această comandă va extrage o bucată de 3 minute din fișierul video1.mpg, începând de la minutul 1 (până la minutul 4, evident...), sub numele de video2.mpg. Înlocuind numele fișierului cu cel corect în cazul nostru și fixând durata porțiunii tăiate și punctul de start, putem obține ceea ce dorim (-t= timp, durată, iar -ss= poziția de start).



7- Extragere imagini din fișier video
ffmpeg -i sursă image2image-%4d.jpg
Se poate să adăugăm ceva parametri:
-r      = frame rate/ implicit e 25 de imagini/ secundă, -r 1 = o imagine pe secundă;
-f      = formatul dorit;
-s     = dimensiune imagine/ implicit e dimensiunea din video;
-ss   = pornește luarea imaginilor la un moment dat (-ss 01:19:45   va începe luarea de imagini la 1 oră, 19 minute și45 secunde de la începerea redării); în combinație cu -t putem scoate imagini în mod selectiv= începând la... timp de 12 secunde de exemplu (-ss 01:19:45 -t 12);
-t     = timpul cât se iau imagini.

image-%4d.jpg   = stabilește numele imaginilor ca image-0001.jpg, image-0002.jpg, etc, adică %4d înseamnă numerotarea imaginilor cu 4 cifre, consecutiv. Putem folosi %2d sau %3d, sau %6d, în funcție de câte imagini credem că vor rezulta, cu cât se capturează mai mult timp, cu atât imaginile vor fi mai multe... Recomand salvarea imaginilor într-un director anumit, deci vom adăuga calea către acesta la nume!



8- Marcare video cu logo (watermark)
Putem însemna fișierele noastre video (capturile de ecran de pildă) cu o imagine/ logo sau cu un video:
ffmpeg -i sursă.avi -vf "movie=watermark.png [wm]; [in][wm] poziție-logo [out]" -s 1290x960 rezultat.avi
 Exemplu concret:
ffmpeg -i captura.avi -vf "movie=watermark.png [wm]; [in][wm] overlay=10:main_h-overlay_h-10 [out]" -s 1280x960 captura-mod.avi
- captura.avi                                              = fișier video inițial;
- watermark.png                                       = imagine/ logo de adăugat;
- overlay=10:main_h-overlay_h-10      = poziție logo pe video;
- captura-mod.avi                                     = video cu logo, rezultatul.
 Detalii: http://stressat.blogspot.com/2011/10/watermark-video.html


9- Înregistrare cameră web

 Redare webcam:
ffplay -f video4linux2 /dev/video0
Înregistrare webcam:
ffmpeg -f video4linux2 -i /dev/video0 captură.avi      (sau ce format doriți)



 Mi se pare corect să precizez că există diferite interfețe grafice pentru ffmpeg, cum ar fi de exemplu Winff sau Avanti. În Arch Linux găsiți Winff în AUR, îl instalați cu yaourt -S winff. Cu ajutorul winff puteți manipula fișiere audio/ video, oricum este doar o interfață, totul se face de fapt în background, în linia de comandă. Ceea ce-mi amintește că trebuie să setați în Winff- Edit- Preferences- General directorul unde veți salva rezultatele, iar în Winff- Edit- Preferences-Linux- terminalul pe care-l folosiți, implicit este xterm, pentru Kde trebuie înlocuit cu konsole, pentru Gnome cu gnome-terminal.



 Există mult mai multe posibilități, pentru amănunte vedeți:  http://ffmpeg.org/faq.html și http://howto-pages.org/ffmpeg/ .


Sursă: http://wiki.mandrivausers.ro/mandriva/ghid/terminal_2#ffmpeg

4 comentarii:

  1. ce rost are -sameq ?
    eu pentru conversie video mp3 folosesc "ffmpeg -i a.avi -ab 320K a.mp3"

    RăspundețiȘtergere
  2. Mda, la video > .mp3 nu are rost, l-am trecut din obișnuință... MUlțumesc, am modificat.
    Oricum, fiecare își găsește parametrii optimi. Poți adăuga de exemplu -ar 44100 -ac 2 pentru compatibilitate cu standardul audio CD-DA, sau -acodec copy pentru extragere audio fără procesare, sau poți lăsa ffmpeg să folosească parametrii impliciți.

    RăspundețiȘtergere
  3. Cum se pot taia bordurile verticale (negre) ale unui film 4:3 astfel incat fisierul video sa-l poti viziona la alegere 4:3 sau 16:9 ?

    RăspundețiȘtergere
    Răspunsuri
    1. Uite ca nu stiu, dar poti seta aspectul la redare in player. In smplayer cu tasta a, in mplayer poti pune in fisierul de setari:
      aspect=<0-3>
      Specify input aspect ratio:
      0: 1:1
      1: 4:3 (default)
      2: 16:9
      3: 2.21:1
      sau direct in comanda.

      Ștergere

Back to top