Difference between revisions of "GStreamer Tips & Tricks"
From linux360
m (→Video) |
m (User talk:Cbidea/GStreamer moved to GStreamer Tips & Tricks: Acum ofera ceva informatii. Pana il definitivez sa mai fie citit si de altcineva) |
(No difference)
|
Revision as of 01:15, 20 March 2007
GStreamer Tips & Tricks
GStreamer este o librărie multimedia open-source construită folosind celebra GLib şi are un API care se ghidează după multe dintre principiile librăriei GTK+. Nu o să vorbesc despre cum să programaţi cu GStreamer, ci voi prezenta aici modalităţi inedite de a face lucruri de zi cu zi cum ar fi convertirea fişierelor audio dintr-un format în altul, redarea lor, redarea fişierelor video, redarea fişierelor video prin reţea, etc.
Introducere
GStreamer defineşte următoarele:
- element - obiectul de bază - bin - container pentru obiecte - pipeline - un bin specializat - pad - poate fi privit ca un port (sursa/destinatie in functie de cum sunt legate)
În principiu mai multe elemente sunt plasate pe un pipe şi apoi pad-urile acestora sunt legate astfel încât, când un stream va traversa acel pipe, acesta va fi modificat în funcţie de natura elementelor pe care le traverseaza. De exemplu un element poate să crească volumul, un altul poate să codeze un stream într-un anumit format, să citească dintr-un fişier, să trimită stream-ul la placa de sunet, etc.
Pentru a vedea toate elementele instalate in sistem putem folos utilitarul gst-inspect.
Audio
Însă utilitarul pe care-l vom folosi este gst-launch. Acesta ştie să construiască un pipe şi să o pună în starea de play. Este un tool făcut în principiu pentru depanarea elementelor în momentul în care scrii aplicaţii GStreamer dar se poate dovedi foarte util în foarte multe cazuri.
gst-launch filesrc location=fisier.mp3 ! decodebin ! autoaudiosink
Am folosit utilitarul gst-launch pentru a construi un pipe cu trei elemente. Primul element deschide un fişier si trimite totul mai departe la decodebin. Decodebin este un element foarte important. Acesta ştie să construiască în mod dinamic un pipe care să ştie să citească ceea ce primeşte de la sursă (de la filesrc) şi ştie să trimită la destinaţie (autoaudiosink) într-un format acceptat de destinaţie. În mod normal nu ne interesează ce se foloseşte dar unde ar mai fi distracţia dacă nu încercăm să construim singuri pipe-ul folosind mai multe codec-uri care fac acelaşi lucru.
În final autoaudiosink reprezintă adaptorul de sunet (driverul în principiu). GStreamer ştie să trimită mai departe la driver-ul implicit din sistem care poate fi alsa, oss sau un server de sunet cum ar fi esd.
Este bine de amintit aici că există elemente speciale numite elemente sursă (source elements) şi elemente destinaţie (sink elements) care nu pot fi puse decât ca primele sau ultimele elemente într-un pipe. Am văzut deja câte un element din fiecare categorie: filesrc (elemente sursă) şi audiosink (elemente destinaţie). De obicei acestea poartă sufix-ul sink sau respectiv src.
Ca să vedeţi ce astfel de elemente ştie să folosească GStreamer puteţi folosi gst-inspect.
gst-inspect | grep sink
Orice element poate avea proprietăţi şi semnale. Cu semnalele nu vom avea tangenţă prea mult. Am văzut deja o proprietate a elementului filesrc, numită location. Acestea pot fi setate folosind grupuri de forma (nume proprietate)=(valoare) despărţite între ele prin virgule.
Pentru a afla detalii despre un element şi proprietăţile acestuia putem folosi gst-inspect.
gst-inspect <nume-element>
Folosind metoda de până acum, se poate reda orice melodie în orice format cunoscut de GStreamer. Dar metoda nu prezintă prea mare interes. Nu ne-am murdărit mâinile până acum. Pipe-ul este construit automat de elementul special decodebin.
Să vedem de ce avem nevoie. Cu filesrc putem citi un fişier. După trebuie să-l despachetăm ca să ajungem la miere (datele conţinute de acesta). GStreamer numeşte elementul care execute această operaţie, demuxer. Aceste elemente poartă de obicei sufixul "demux".
phaser@diesel:~$ gst-inspect | grep demux | grep mp3
ffmpeg: ffdemux_mp3: FFMPEG MPEG audio demuxer
Eu am instalat elementul ffdemux_mp3 dar pot fi şi altele. Există elemente care execută două lucruri: despachetarea şi decodarea. Noi o sa facem decodarea folosind alt element. Elementele de decodare poartă, de obicei, sufixul "dec".
phaser@diesel:~$ gst-inspect | grep dec | grep mp3
mad: mad: mad mp3 decoder
ffmpeg: ffdec_mp3on4: FFMPEG MP3ON4 decoder
ffmpeg: ffdec_mp3adu: FFMPEG ADU-formatted MPEG-1 layer 3 audio decoder
ffmpeg: ffdec_mp3: FFMPEG MPEG-1 layer 3 audio decoder
flump3dec: flump3dec: Fluendo MP3 Decoder
Am găsit elementul ffdec_mp3 pentru decodarea mp3. Şi elementul mad ştie să decodeze şi este unul din elementele cu dublu scop de care am vorbit anterior (demux+decoder). Acum putem să ne construim pipe-ul.
gst-launch filesrc location=fisier.mp3 ! ffdemux_mp3 ! ffdec_mp3 ! audioconvert ! autoaudiosink
gst-launch filesrc location=fisier.mp3 ! mad ! audioconvert ! autoaudiosink
Aşa cum se observă putem face acelaşi lucru în mai multe feluri pentru că putem avea mai multe plugin-uri care fac acelaşi lucru. Elementul de noutate este audioconvert. Din ceea ce ne spune gst-inspect aflăm că audioconvert ştie să facă conversia între mai multe formate. Elementul poate executa acest lucru pentru că GStreamer are un mecanism prin care poate afla în mod dinamic capabilităţile pad-urilor sursă şi pad-urilor destinaţie din fiecare element.
Prin folosirea gst-launch spunem doar că legăm două elemente. GStreamer găseşte mai întâi pad-urile fiecărui element şi încearcă să le lege. Unele combinaţii nu vor reuşi (ex. când încearcă să lege o sursă cu o sursă) şi le va elimina. Face acest lucru până găseşte o legătură posibilă între pad-urile celor două elemente. Dacă nu este posibil va semnala eroarea şi se va opri.
Până acum ne-am jucat numai cu fişiere mp3 dar asta nu înseamnă că doar atât putem face. Aceiaşi metodă merge şi pentru alte formate cum ar fi vorbis.
gst-launch filesrc location=fisier.ogg ! oggdemux ! vorbisdec ! audioconvert ! autoaudiosink
De obicei dacă nu ştim cu ce să redăm un anumit format, folosim decodebin şi lansăm gst-launch cu opţiunile „-v -m” şi ne uităm la output să vedem ce găseşte GStreamer automat şi putem încerca şi noi să construim pipeline-ul folosind aceleaşi elemente.
Şi dacă avem decodere trebuie să avem şi encodere. Encoderele au sufixul enc de obicei. Consecinţa imediată a acestui lucru este că putem uşor converti un format în celălalt.
gst-launch filesrc location=fisier.mp3 ! mad ! audioconvert ! vorbisenc ! oggmux ! filesink location=fisier.ogg
Folosind pipe-ul de mai sus convertim un fişier mp3 într-unul vorbis. Acest lucru putem să-l facem cu wav, cu flacc, cu speex, etc. Orice combinaţie de formate pentru care GStreamer are plugin-uri.
Desigur că fiecare element în parte poate fi setat după nevoi. Folosind proprietăţile encoder-ului se pot obţine fişiere mai mici sau calitativ mai bune, în funcţie de setări.
Video
Se ştie că GStreamer e folosit de mai multe playere multimedia printre care binecunoscutul Totem, acesta descurcându-se cu formatele video la fel de bine. De ce avem nevoie ca să redăm un fişier video? Păi la început de foarte puţin.
gst-launch -v -m filesrc location=film.avi ! decodebin name=pipe1 pipe1. ! xvimagesink pipe1. ! audioconvert ! autoaudiosink