
GINI - Streamované multimédiá jednoducho a rýchlo
S problematikou sprevádzkovania streamovaného audia a videa sa už iste snažili vysporiadať mnohí z nás. Aj keď sa jedná o veľmi komplexnú problematiku, v mnohých prípadoch postačí základný prístup k celkovej realizácii, ktorý môže byť častokrát omnoho jednoduchší, ako by sa na prvý pohľad mohlo zdať. V dnešnom príspevku si ukážeme ako na to.
1. Úvod
Zaujímavým projektom, ktorý sa v poslednej dobe začína čoraz častejšie objavovať v reálnych nasadeniach okolo nás je GINI pochádzajúci z aktivít vývojára menom Krisztian Pifko. Jedná sa o kompletný balík pozostávajúci z troch samostatných funkčných súčastí, ktorého domovská stránka projektu je k dispozícii na http://gini.sourceforge.net. Samotný mechanizmus spoľahlivo pracuje na množstve platforiem, pričom je natívne zakomponovaná podpora streamingu audioformátov MP3, Ogg Vorbis, videoformátov RIFF AVI (vrátane DivX enkódovania), Microsoft ASF/ASX/WMV/WMA, rozpracovaná je možnosť streamovania Apple QuickTime video a RealNetworks RealMedia, ktorá je experimentálne k dispozícii, i keď zatiaľ s istými nedostatkami. Toľko asi na úvod, pustíme sa do inštalácie
2. Inštalácia
Domovská stránka projektu nás okamžite nalinkuje prostredníctvom download sekcie k balíčku zdrojového kódu aktuálnej verzie nesúcej označenie 0.5.1. Pristúpime primárne k dekomprimácii
tar xzvf gini-0.5.1.tar.gz
cd gini-0.5.1
Nasledujúcou úlohou je typicky predkompilačná konfigurácia nasledovaná samotným kompilovaním a rozdistribuovaním vzniknutých bináriek. Vďaka prepracovanosti prebehne kompilácia na takmer všetkých systémoch vybavenými príslušnými knižnicami bezproblémovo, takže je vhodné vopred skontrolovať, či sú v systéme prítomné knižnice glib 1.2 a vyššie, libogg a libvorbis. V prípade, že je všetko vporiadku, pustíme sa do práce
./configure
make
make install
Keďže nie je potrebné uskutočniť žiadnu dodatočnú ručnú distribúciu, ani presun konfiguračných súborov, môžeme pokojne s úsmevom na tvári pokračovať v našej práci. To najdôležitejšie už máme za sebou.
3. Architektúra
Streamovací balík GINI sa skladá z troch základných komponentov. Prvým je streamovací server GINI, ktorý je v značnej miere kompatibilný so svojimi kolegami z brandže, takže sa niet čoho obávať. Druhý dôležitý prvok je reprezentovaný feederom GINIFEED, ktorého úlohou je dopraviť vopred pripravené audio/video streamy streamovaciemu serveru. V úlohe feedera je však možné použiť alternatívne ľubovoľný balík kompatibilný so štandardom icecast, ako sú napríklad shout, xmms-liveice a podobne. Posledným prvkom je administratívna konzola GINICON, ktorá slúži na správu a získanie prehľadu o systéme, či už lokálne, alebo prostredníctvom sieťového interkonektu. Hneď na úvod je vhodné uvedomiť si, že každý z týchto komponentov môže byť hostovaný na inom stroji, pričom viacero feederov a administratívnych konzol môže súčasne pristupovať k streamovaciemu serveru, ktorý poskytuje dodávané streamy jednotlivým klientom prezentovaným širokou škálou multimediálnych prehrávačov.
4. Spustenie streamovacieho servera
Pred spustením streamovacieho servera je vhodné vopred si vyčleniť na ktorom porte bude prevádzkovaný (implicitne 8000), aké obmedzenia nastavíme pre počet súčasne pripojených klientov, feederov prípadne administratívnych konzol, pričom je možné pripraviť si zabezpečenie vstupným heslom, čo je viac ako nevyhnutné. V najjednoduchšom prípade pre beh na porte HTTP v daemon móde pri zabezpečení heslom využime spustenie pomocou
#gini -P 80 -z -w opensesami
Pri neskorších pokusoch budeme dbať na limitovanie počtu obsluhovaných klientov parametrom -m, počtu feederov parametrom -s a počtu konzol pomocou -c pričom implicitné hodnoty dosahujú 8/2/2, napríklad
#gini -z -w opensesami -m 50 -s 3 -c 1
zaujímavá je aj možnosť špecifikovania umiestnenia jednotlivých logov, ktoré budú cenným prostriedkom pri vyhodnocovaní ako využitia a prístupov, tak systémových udalostí, ktoré nám pomôžu pri hľadaní a riešení problémov
#gini -z -w opensesami -S /var/log/gini/status.log -Y /var/log/gini/system.log \
-A /var/log/gini/access.log
5. Playlisty pre dodávanie streamov
Vopred si treba uvedomiť, že GINIFEED je určený pre dodávanie vopred pripravených hotových streamov. Tento feeder žiadnym spôsobom neupravuje dodávaný stream, nedochádza teda k jeho resamplovaniu, ani online tvorbe z príslušného zdroja audio alebo videosignálu. Základom je teda playlist, ktorý špecifikuje zoradený zoznam súborov jednotlivých streamov. Aby sme si ušetrili ich ručnú tvorbu, jednoduchým spôsobom využijeme príkazy ako
ls /foodir/*.avi > playlist.foo
find /mnt/cdrom -type f -name "*.mp3" > playlist.cdmpeg
V prípade vytvárania playlistov pre videostreamy je doporučované dodržať rovnakú kvalitu všetkých súborov v rámci playlistu, aby sa predišlo zbytočným komplikáciám
6. Streamujeme audio
V prípade, že máme pripravené playlisty a streamovací sever GINI beží, začať môžeme najjednoduchšie implicitným dodávaním z playlistu na server chránený heslom pomocou
ginifeed -M localhost -P 80 -p plist -n lz-stream -w opensesami -m lz -G
V tomto prípade zasielame obsah playlistu na server chránený heslom "opensesami" bežiaci na localhost:80, pričom v úlohe playlistu účinkuje súbor s názvom plist. Názov streamu sme si zvolili pre náš príklad lz-stream, pričom z použitých mp3 súborov preberáme ID3 tagy. Veľmi dôležitú úlohu hrá parameter -m, ktorý špecifikuje mountpoint, cez ktorý bude príslušný stream k dispozícii, čo umožňuje odlíšiť jednotlivé streamy, ktoré sú na serveri k dispozícii
Veľmi často sa stáva, že chceme sprístupniť k dispozícii rovnaký stream v rozličných kvalitách. V tomto prípade je potrebné mať pripravené audiostreamy vo viacerých kvalitách pričom pre jednoduchosť tvorby playlistu využijeme možnosť priradenia prefixov a suffixov. V praxi to môže znamenať pripravenie adresárovej štruktúry
/mnt/musiclab/ogg24/
/mnt/musiclab/ogg56/
/mnt/musiclab/mp324/
....
kde sú umiestnené jednotlivé skladby v rovnakej adresárovej štruktúre pri zachovaní rovnakých mien. Keďže v našom prípade budeme poskytovať dve kvality ogg a jednu mp3, fixnými zostávajú iba časti ciest a názvy súborov bez ich prípon. Kompletizáciu plných názvov playlistu ktoré majú formu
album1/song1
...
album99/song12
dosiahneme pomocou využitia parametrov -d a -s
ginifeed -p playlist -d /mnt/musiclab/ogg24/ -s .ogg
ginifeed -p playlist -d /mnt/musiclab/ogg56/ -s .ogg
ginifeed -p playlist -d /mnt/musiclab/mp324/ -s .mp3
Problém by mohol naoko nastať pri využití možnosti náhodného výberu poradia, čo je možné zabezpečiť parametrom -r. V tomto prípade prichádza na pomoc možnosť špecifikovať rovnaké random seed hodnoty parametrom -S, čo nám zabezpečí zhodnú pseudonáhodnosť pre všetky bežiace inštancie feedera. Za zmienku stojí spomenúť, že implicitne sa pri dosiahnutí konca playlistu pokračuje jeho spracovaním od začiatku, čiže jedná sa o autorepeat.
Kto by si chcel doplniť streamovanie audia o možnosť rozšírenia o živé streamy pochádzajúce napríklad z rádiovej karty, alebo linkového vstupu, ten môže v úlohe feedera použiť xmms-liveice, ktorý sme si v minulosti už priblížili
7. Streamujeme video
Dopravenie videostreamu serveru prostredníctvom nástroja GINIFEED uskutočňujeme rovnako, ako je tomu pri audiostreamoch, pričom sú k dispozícii rovnaké konfiguračné parametre. Vhodné je podotknúť, že v niektorých ojedinelých prípadoch môže dôjsť k problematickému stavu, kedy GINI odmietne dodaný stream z dôvodu, že jeho hlavička je dlhšia, ako veľkosť buffera. V tomto prípade je vhodné parametrom -b indikovať vyšší bitrate. Pri streamovaní videa je vhodné držať sa stropu 300-400 kbps, aby sa zamedzilo
Pre príklad nám teda môže poslúžiť
#ginifeed -H localhost -P 80 -p mlist -n TestMovie -m trailer -w opensesami
8. Prehrávame streamy
Čo sa týka prehrávania audiostreamov, situácia je na tomto poli veľmi stabilná. Pre prehrávanie audiostreamov je možné použiť mpg123, ogg123, xmms, zinf, winamp, ms media player alebo realplayer, pričom jednotlivé streamy identifikujeme použitým mountpointom, v našom prípade napríklad
#mpg123 http://192.168.0.1:80/lz
Na poli videostreamov je situácia zatiaľ v štádiu dolaďovania. Pre prehrávanie videostreamov je možné efektívne bezproblémovo použiť mplayer, či už samostatne, alebo v prípade embedded riešení projekt Movix http://movix.sourceforge.net, tento prehrávač využívajúci. Pre predídenie prípadným problémom je vhodné definovať veľkosť vyrovnávajúceho bufferu v rozmedzí od 1 do 2MB, čo v mnohých prípadoch rieši situáciu odmietnutia prehratia.
#mplayer -cache 1024 -vo aa http://192.168.0.1/trailer
Playing http://192.168.0.1/trailer
Connecting to server 192.168.0.1...
Cache size set to 1024 KBytes
Connected to server: 192.168.0.1
Cache fill: 19.53% (204800 bytes) Detected AVI file format!
VIDEO: [DIV3] 320x240 24bpp 29.97 fps 195.4 kbps (23.9 kbyte/s)
9. Administrujeme a analyzujeme
Na rad sa dostáva posledný prvok nášho balíka a to GINICON. Jedná sa do užívateľské rozhranie k serverovej časti, ktoré zabezpečuje prostredníctvom jednoduchých príkazov realizovať prístup k informáciám súvisiacich s aktuálnymi spojeniami s možnosťou sledovania priebehu a zrušenia vybraných konekcií. V prípade behu GINI v pozadí v daemon móde využijeme túto konzolu, v prípade, že pri spustení servera parameter -z vynecháme dostávame sa do administratívnej konzoly priamo. Konekt uskutočníme pomocou
#ginicon -H 192.168.0.1 -P 80 -w opensesami
Bohaté informácie sú k dispozícii prostredníctvom logových súborov. status.log sprístupňuje cyklicky generované údaje vhodné pre popisnú informáciu s možnosťou publikovania na webovej stránke, popri možnosti generovania .cue súborov prostredníctvom parametra -c aplikovateľného pri feederi.
Uptime: 2 days, 13 hours, 45 minutes and 58 seconds
Connections: all: 514, feed: 12, recv: 851; Active: temp: 0, feed: 4, recv 3
Data: in all: 384032 G, in feed: 384012 G, out all: 38846 G, out stream: 38313 G
Bandwidth: in: 125 kbps out: 548 kbps
Feeds:4
Admins:1
Clients:3
Systémový logový súbor pre zmenu zaznamenáva jednotlivé operácie, čo nám umožňuje vyhľadávať chyby a operačné nedostatky. Prekvapí značná prehľadnosť a vysoká informačná hodnota.
[04/Feb/2003:11:19:47 +0000]: new connection from: 127.0.0.1
[04/Feb/2003:11:19:48 +0000]: incoming feed 128 kbps
[04/Feb/2003:11:19:48 +0000]: incoming stream is MP3
[04/Feb/2003:11:20:15 +0000]: remote feeder closed
Posledným zdrojom informácií je log poskytujúci informácie o prístupoch. Vzhľadom na to, že bola dodržaná štandardizovaná štruktúra, jednoduchým spôsobom je možné uskutočniť vizualizáciu a spracovanie prostredníctvom nástrojov ako sú webalizer a podobne.
192.168.1.17 - - [04/Feb/2003:13:01:34 +0000] "GET /film HTTP/1.0" \
200 8499 "-" "MPlayer/0.90rc2-2.95.4 "
10. Záver
Úlohou dnešného príspevku bolo demonštrovať možnosti jednoduchého streamingu audia a videa. Dúfam, že s dôrazom na podrobnú popisnosť a dodržanie súslednosti sa nám úlohu podarilo splniť. S pomocou softwarového balíčka GINI sa teda každý môže pustiť do streamovania, čo nám pripraví živný podklad pre ďalšie experimentovanie s komplexnejšími projektami. Prehľadnosť, jednoduchosť prístupu a implementácie sú hlavnými črtami tohto projektu, ktorý si nájde nejedno uplatnenie v praxi.
Čo sa týka zabezpečenia podpory a konzultácií jednotlivých implementácií, k dispozícii je viacero spôsobov. Na IRC je k dispozícii kanál s názvom #gini, prístup k aktívnemu mailinglistu zabezpečuje rozhranie http://lists.sourceforge.net/lists/listinfo/gini-user Podporu zabezpečujú ako samotní užívatelia, tak autor, pričom v systémoch aktívne cykluje množstvo informácií.
|