Vysílání a přenos audio signálu ve velmi vysoké kvalitě do sítě Internet

Technická zpráva CESNETu číslo 24/2003
k dispozici též ve formátech PDF, PostScript a XML.

Miloš Wimmer
30. 11. 2003

1   Úvod

Cílem úkolu bylo navrhnout a realizovat systém, který umožní nepřetržité živé vysílání programu stanic Českého rozhlasu do sítě Internet ve velmi vysoké kvalitě.

Český rozhlas vysílá živě do Internetu program svých významných stanic pomocí technologií Real Audio a Windows Media v rychlostech 10-32 kb/s. Tímto způsobem lze dosáhnout jen nižší kvality přenášeného zvuku. Koncem roku 2002 došlo mezi sdružením Cesnet a Českým rozhlasem k uzavření dohody o spolupráci ve vytvoření experimentálního systému, který umožní vysílání živého programu stanic ČRo do Internetu ve vysoké kvalitě.

Po zhodnocení požadovaných cílů jsme se rozhodli realizovat celý systém na základě technologie vysílání audio signálu v kompresních formátech MPEG (mp3) a ogg v šířce pásma 128 kb/s, později jsme vysílání rozšířili o stream ogg se šířkou pásma 256 kb/s.
Realizovat vysílání ve dvou formátech jsme se rozhodli proto, že mp3 je dnes ve světě nejrozšířenější a je jaksi automaticky očekáván. Druhý formát ogg je relativně mladý a lze jej považovat za formát budoucnosti. Je vyvíjen jako OpenSource a na rozdíl od mp3 není zatížen žádnými patentovými nároky ani licencemi, které by omezovaly jeho volné a bezplatné používání. Kromě toho ho považujeme za technicky lépe propracovaný, kdy při stejné nebo menší použité šířce pásma dosahuje srovnatelných nebo lepších zvukových výsledků (porovnání zvukové kvality je subjektivní záležitostí, úsudek si může udělat každý sám např. podle srovnávacích záznamů uložených ve zvukových souborech různých formátů a rychlostí na [12]). Formát ogg podporují nejrozšířenější zvukové přehrávače (např. xmms, winamp, zinf, qcd, apod.).

V současnosti vysíláme streamy stanic ČRo1-Radiožurnál, ČRo2-Praha a ČRo3-Vltava ve formátech mp3 128 kb/s, ogg 128 kb/s a ogg 256 kb/s a stream Rádia Akropolis ve formátu ogg 128 kb/s.

2   Použitá zařízení a komponenty

Při analýze řešeného úkolu jsme dospěli k závěru, že vzhledem k odlišným požadavkům procesu kódování vstupních analogových signálů do mp3 a ogg streamů a procesu streamování bude lepší rozložit technické řešení na dva stroje - server pro kódování a server pro streamování. Toto rozložení umožňuje také velmi dobrou škálovatelnost celého systému. Při kódování většího množství analogových signálů/stanic do dalších streamů lze celý systém rozšířit jen o další kódovací servery, protože streamovací server je pro velký počet připojovaných klientů dostatečně dimenzován. Pořízení dalšího streamovacího serveru by mělo smysl pro dosažení velmi vysoké dostupnosti služby, kdy by se mohly oba servery doplňovat a eliminovat svoji chvilkovou nedostupnost (např. při rebootu nebo poruše). K dosažení tohoto cíle není zapotřebí clusterového zapojení serverů, protože informaci o různých serverech poskytujících požadovaný stream dostává zvukový klient před úvodním připojením ke streamu. Je-li pak jeden ze serverů nedostupný, klient se automaticky obrací na dalšího v pořadí.

Experimentálně jsme ověřili, že kódování analogového dvoukanálového audio signálu do streamu 128 kb/s ve formátu ogg v reálném čase a se zanedbatelným zpožděním konzumuje 50 % času procesoru Intel Pentium II-Xeon/400 MHz. Z toho je zřejmé, že pro kódování většího počtu streamů je zapotřebí stroj se značným výkonem procesoru a s dostatečným množstvím PCI slotů pro vkládané zvukové karty. Při volbě zvukových karet jsme se rozhodli pro Sound Blaster Audigy. Patří mezi kvalitnější karty a má i dobrou podporu v systému. Každý proces vytvořený na streamovacím serveru pro jednoho připojeného klienta alokuje 5 MB paměti, takže streamovací server musí disponovat odpovídající velikostí RAM. Vstupní audio signál stanic Českého rozhlasu přebíráme z tunerů Sony ST-SE 370, připojených na vstup zvukových karet kódovacího serveru.

Na základě těchto předpokladů jsme pořídili servery v konfiguraci:
kódovací server
  • DELL PowerEdge 2600, 2x procesor P4 Xeon/2.4GHz, 1GB RAM
  • integrovaná síťová karta Intel PRO/1000
  • 4x zvuková karta Sound Blaster Audigy

streamovací server
  • DELL PowerEdge 350, procesor P-III/1GHz, 1GB RAM
  • síťová karta Intel PRO/1000

tunery
  • Sony ST-SE 370

Celý systém běží v současnosti na těchto dvou serverech a čtyřech tunerech umístěných v prostorách počítačového sálu sdružení Cesnet.

[Obrázek]

Obrázek 1: Pohled na tunery a servery umístěné i s jinými zařízeními v racku počítačového sálu Cesnet.

Po vyzkoušení řady programového vybavení jsme na pozici enkodérů zvolili aplikaci DarkIce [1] a na pozici streamovacího serveru aplikaci icecast2 [2]. Obě aplikace jsou vyvíjeny jako OpenSource projekty a lze je volně použít. Běží nad operačním systémem Linux, my používáme distribuci Debian [3].

Na serverech jsme použili tyto softwarové komponenty:
kódovací server
  • operační systém Linux Debian (sid)
  • jádro 2.4.21-rc2-ac2
  • glibc 2.3.2
  • alsa-0.9.6
  • lame-3.93.1
  • libvorbis-1.0.0
  • darkice-0.13.1

streamovací server
  • operační systém Linux Debian (sid)
  • jádro 2.6.0-test5-bk3
  • glibc 2.3.2
  • libvorbis-1.0.0
  • icecast-2.0-alpha-2

3   Popis zapojení zařízení

Kódovací server slouží jako producent streamů. Na analogové vstupy jeho zvukových karet jsou připojeny tunery naladěné na vysílání stanic ČRo1-Radiožurnál, ČRo2-Praha a ČRo3-Vltava. Čtvrtou zvukovou kartu používáme pro experimentální účely. Zvukový signál z každé karty zpracovává aplikace DarkIce, která provádí jeho čtení, vzorkování (44.1 kHz, 16 bitů, 2 kanály) a kódování do streamů požadovaných formátů (ogg a mp3) a toků (128 kb/s a 256 kb/s). Hotové streamy pak vysílá na streamovací server.

Streamovací server slouží jako server, k němuž se připojují jednotliví klienti, kteří chtějí vysílání přijímat. Server nyní přijímá 9 vstupních streamů od kódovacího serveru a 1 stream od kódovacího serveru Radia Akropolis a provádí jejich distribuci připojeným klientům.
Klienti se k serveru připojují nejčastěji pomocí odkazů na WWW stránkách (streamovacího serveru, živého vysílání Českého rozhlasu, apod.). CGI skripty stojící za příslušnými odkazy odešlou WWW prohlížeči odpověď s patřičnou hlavičkou, podle níž se na klientské stanici automaticky spustí přehrávač zvuku, který začne vlastní stream přijímat a přehrávat.

[Obrázek]

Obrázek 2: Schéma zapojení zařízení.

Stream ve formátu mp3 je vysílán ve variabilní šířce přenosového pásma, jejíž průměr se pohybuje kolem 128 kb/s (ABR). Stream ve formátu ogg vysíláme v ABR 128 kb/s resp. 256 kb/s. Touto technikou dosahujeme dalšího zvýšení kvality, protože při řidším frekvenčním spektru a malé dynamice aktuálně kódovaného signálu generuje kodér méně dat, zatímco při dynamickém signálu se širokým frekvenčním spektrem může použít většího objemu dat. Jen pro srovnání - na přenos téhož nekomprimovaného signálu by bylo potřeba kanálu se šířkou pásma 1411 kb/s.

Server je zapojen do běžné sítě IPv4 i do nastupující IPv6 sítě, takže své streamy poskytuje klientům v obou těchto sítích.
V síti IPv4 vysílá na adresách

a v síti IPv6 vysílá na adresách

4   Popis konfigurace aplikací kodéru DarkIce a serveru icecast2

Ukázka konfigurace kodéru DarkIce pro streamy ČRo1-Radiožurnál v souboru darkice-cro1.cfg:

# this section describes general aspects
# of the live streaming session
[general]
duration        = 0
    # duration of encoding, in seconds. 0 means forever
bufferSecs      = 5
    # size of internal slip buffer, in seconds

# this section describes the audio input that will be streamed
[input]
device          = /dev/dsp
    # OSS DSP soundcard device for the audio input
sampleRate      = 44100
    # sample rate in Hz. try 11025, 22050 or 44100
bitsPerSample   = 16
    # bits per sample. try 16
channel         = 2
    # channels. 1 = mono, 2 = stereo

# this section describes a streaming connection to an icecast2
# server there may be up to 8 of these sections,
# named [icecast2-0] ... [icecast2-7] these can be mixed with
# [icecast-x] and [shoutcast-x] sections
[icecast2-0]
bitrateMode     = abr
    # average bit rate
format          = mp3
    # format of the stream: ogg vorbis
bitrate         = 128
    # bitrate of the stream sent to the server
server          = amp.cesnet.cz
    # host name of the server
port            = 8000
    # port of the icecast2 server, usually 8000
password        = XXXX
    # source password to the icecast2 server
mountPoint      = cro1.mp3
    # mount point of this stream on the icecast2 server
name            = CRo1 - Radiozurnal
    # name of the stream
description     = News and current affairs station
    # description of the stream
url             = http://www.rozhlas.cz/radiozurnal/
    # URL related to the stream
genre           = news
    # genre of the stream
public          = yes
    # advertise this stream?

# this section describes a streaming connection to an icecast2
# server there may be up to 8 of these sections,
# named [icecast2-0] ... [icecast2-7] these can be mixed with
# [icecast-x] and [shoutcast-x] sections
[icecast2-1]
bitrateMode     = abr
    # average bit rate
format          = vorbis
    # format of the stream: ogg vorbis
bitrate         = 128
    # bitrate of the stream sent to the server
server          = amp.cesnet.cz
    # host name of the server
port            = 8000
    # port of the icecast2 server, usually 8000
password        = XXXX
    # source password to the icecast2 server
mountPoint      = cro1.ogg
    # mount point of this stream on the icecast2 server
name            = CRo1 - Radiozurnal
    # name of the stream
description     = News and current affairs station
    # description of the stream
url             = http://www.rozhlas.cz/radiozurnal/
    # URL related to the stream
genre           = news
    # genre of the stream
public          = yes
    # advertise this stream?

# this section describes a streaming connection to an icecast2
# server there may be up to 8 of these sections,
# named [icecast2-0] ... [icecast2-7] these can be mixed with
# [icecast-x] and [shoutcast-x] sections
[icecast2-2]
bitrateMode     = abr
    # average bit rate
format          = vorbis
    # format of the stream: ogg vorbis
bitrate         = 256
    # bitrate of the stream sent to the server
server          = amp.cesnet.cz
    # host name of the server
port            = 8000
    # port of the icecast2 server, usually 8000
password        = XXXX
    # source password to the icecast2 server
mountPoint      = cro1-256.ogg
    # mount point of this stream on the icecast2 server
name            = CRo1 - Radiozurnal
    # name of the stream
description     = News and current affairs station
    # description of the stream
url             = http://www.rozhlas.cz/radiozurnal/
    # URL related to the stream
genre           = news
    # genre of the stream
public          = yes
    # advertise this stream?

Ukázka konfigurace serveru icecast2 v souboru icecast.xml:

<icecast>
    <location>Czech Republic, Prague</location>
    <admin>wimmer@zcu.cz</admin>

    <limits>
      <!- Maximální počet klientů ->
        <clients>900</clients>
      <!- Maximální počet zdrojů ->
        <sources>20</sources>
        <threadpool>5</threadpool>
        <queue-size>102400</queue-size>
        <client-timeout>30</client-timeout>
        <header-timeout>15</header-timeout>
        <source-timeout>10</source-timeout>
    </limits>

    <authentication>
        <!- Sources log in with username 'source' ->
        <source-password>XXXX</source-password>

        <!- Admin logs in with the username given below ->
        <admin-user>YYYY</admin-user>
        <admin-password>ZZZZ</admin-password>
    </authentication>

    <!- Uncomment this if you want directory listings ->
    <directory>
        <yp-url-timeout>15</yp-url-timeout>
        <yp-url>http://www.oddsock.org/cgi-bin/yp-cgi</yp-url>
    </directory>
    <directory>
            <yp-url-timeout>15</yp-url-timeout>
            <yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url>
    </directory>
			 
    <hostname>amp.cesnet.cz</hostname>

    <!- You may have multiple <listener> elements ->
      <!- Vysílání na IPv4 adrese ->
    <listen-socket>
        <port>8000</port>
	<bind-address>195.113.161.70</bind-address>
    </listen-socket>

      <!- Vysílání na IPv6 adrese ->
    <listen-socket>
        <port>8006</port>
	<bind-address>2001:718:1:4:202:b3ff:fec3:7594</bind-address>
    </listen-socket>

    <mount>
        <mount-name>/akropolis.ogg</mount-name>
	<username>AAAA</username>
	<password>BBBB</password>
	<max-listeners>100</max-listeners>
    </mount>

    <fileserve>1</fileserve>

    <paths>
        <basedir>/usr/opt/icecast2/share/icecast</basedir>

        <!- Note that if <chroot> is turned on below, these paths must both
             be relative to the new root, not the original root ->
        <logdir>/usr/opt/icecast2/logs</logdir>
        <webroot>/usr/opt/icecast2/web</webroot>
        <adminroot>/usr/opt/icecast2/admin</adminroot>
    </paths>

    <logging>
        <accesslog>access.log</accesslog>
        <errorlog>error.log</errorlog>
      	<loglevel>3</loglevel> <!- 4 Debug, 3 Info, 2 Warn, 1 Error ->
    </logging>

    <security>
        <chroot>0</chroot>
        <changeowner>
            <user>nobody</user>
            <group>nogroup</group>
	</changeowner>
    </security>
</icecast>


Ukázka cgi skriptu, kterým uživatelé spouštějí z prostředí WWW prohlížeče zvukového klienta pro připojení k streamovacímu serveru. Skript nastavuje patřičnou MIME Content-type položku

Content-type: audio/x-scpls

a určuje adresu streamu v podobě

protokol://adresa_serveru:port/jmeno_streamu

Na WWW stránce bývá zapsán pod odkazem typu http://radio.cesnet.cz/cgi-bin/cro1-ogg.pls .

Obsah souboru cro1-ogg.pls:
#!/bin/sh

cat >> ++++END++++
Content-type: audio/x-scpls

[playlist]
numberofentries=1
File1=http://amp.cesnet.cz:8000/cro1.ogg
Title1=CRo1 - Radiozurnal
Length1=-1
Version=2
++++END++++

5   Reálný provoz systému

Systém běží na serveru kódovacím a serveru streamovacím - amp.cesnet.cz (alias radio.cesnet.cz). Streamy lze přijímat buď připojením zvukového klienta přímo na vysílací port serveru (např. http://radio.cesnet.cz:8000/cro1.ogg) anebo automatickým vyvoláním klienta s připojením na patřičný port serveru přes odkaz na WWW stránce. Uživatelé nejčastěji využívají odkazů na stránkách živého vysílání Českého rozhlasu [4], odkazů na indexových serverech internetových rádií [5] a [6] nebo přímo domovské stránky serveru [7].

Provoz celého systému je stabilní. Kódovací server pracuje při kódování 9 streamů v reálném čase pod konstantní zátěží 1.35. Každá instance kodéru DarkIce konzumuje 13% CPU dvouprocesorového serveru. Streamovací server pracuje pod variabilní zátěží, která však nepřekračuje hodnotu 0.5 při 100 současně přihlášených klientech.

Kvalitu zvuku považujeme za vysokou. Bez pochybností nejvyšší kvalitu zaručuje stream ogg 256 kb/s, který se zvukově velmi blíží CD, jeho zvuková scéna je čistá. U streamů 128 kb/s je zvuková scéna trochu užší a méně přehledná. Tyto rozdíly jsou patrné zejména při soustředěném poslechu na kvalitnějším zařízení, běžné počítačové "bedničky" tyto rozdíly částečně stírají. Rozdíly mezi streamy ogg 128 kb/s a mp3 128 kb/s již nejsou tak velké. Podle našeho názoru nabízí ogg 128 kb/s o trochu vyšší kvalitu, což se projevuje zejména ve skladbách s většími dynamickými změnami. V případě snížení šířky přenosového pásma na 64 kb/s by formát ogg byl jednoznačně lepší, než mp3. Ze strany posluchačů je kvalita všech streamů hodnocena výborně.

Časové zpoždění přijímaného streamu je velmi malé (1-3 sekundy) a je určeno především nastavením velikosti vyrovnávací paměti (bufferu) zvukového klienta. Nastavení větší velikosti eliminuje občasné výpadky nebo zpoždění přenášených dat na méně propustných linkách a logicky zvyšuje zpoždění. O něco větší velikost než má základní nastavení doporučujeme použít při přijímání streamu 256 kb/s, protože přijímaných dat je více a vyrovnávací paměť udržuje data na méně než 1 sekundu dopředu.

Ze statistik streamovacího serveru bychom chtěli uvést následující data:

průměrný objem přenesených dat za den:60 GB
průměrný počet klientů připojených za celý den:2 000
maximální počet klientů připojených za celý den:3 000
průměrný počet současně připojených klientů za den: 60
průměrná délka doby připojení jednoho klienta:30 min

Tabulka 1: Statistiky serveru

Vzrůstající zájem o vysílané streamy dokládá následující graf současně připojených klientů ke streamům ČRo1 (špička 100 klientů v květnu 2003 odpovídá poslechu přímých přenosů z mistrovství světa v hokeji).

[Obrázek]

Obrázek 3: graf průměrného a maximálního počtu klientů současně připojených k 128 kb/s ogg a mp3 streamům stanice ČRo1-Radiožurnál za jeden den

Podle původního předpokladu jsme chtěli vstupní audio signály přebírat přímo z linkového výstupu odbavovacího pracoviště Českého rozhlasu a uvažovali jsme o tom, že by kódovací server byl umístěn v budově ČRo. Při tomto řešení bychom potřebovali nepřetržitě vysílat ze sítě ČRo na streamovací server v Cesnetu 9 streamů v celkovém datovém toku 1536 kb/s, což však současný kanál připojení počítačové sítě ČRo do Internetu nedovoluje. Proto jsme jako alternativu použili získávání analogového signálu stanic ČRo z tunerů a kódovací server jsme tak mohli ponechat na sále Cesnetu. Původně jsme se domnívali, že toto řešení bude mít negativní vliv na celkovou zvukovou kvalitu streamů, protože frekvenční rozsah zvukového signálu získaného z FM tuneru (resp. vysílače) je zúžen do pásma 30-15 000 Hz oproti pásmu 2-20 000 Hz používaného u CD.

Technici z ČRo nám poskytli zvukový záznam pořízený z výstupu odbavovacího pracoviště. K našemu překvapení je jeho kvalita shodná se zvukem získaným z tuneru. To znamená, že ke zúžení frekvenčního rozsahu dochází ještě uvnitř pracoviště ČRo a následná FM modulace/demodulace už na kvalitu nemá významný vliv. Připojením kódovacího serveru k odbavovacímu pracovišti ČRo bychom tedy v současnosti dalšího znatelného zvýšení kvality nedosáhli.

Po dohodě s Českým rozhlasem jsme získali přístup k denním exportům jeho programového systému ve formátu xml, které obsahují jména programů a jejich minutáž. Těchto údajů využíváme k obohacení streamů o doprovodnou textovou informaci (tzv. metadata) o právě vysílaném programu. Pro zpracování těchto informací a aktualizaci metadat streamovacího serveru jsme vytvořili skripty.

[Obrázek]

Obrázek 4: Zvukový klient Freeamp

[Obrázek]

Obrázek 5: Zvukový klient Quintessential Player

6   Technické podrobnosti

V této části uvedeme technické detaily o výběru a použití programového vybavení a o potížích, které jsme řešili.

S ohledem na to, že vytvářený streamovací systém má charakter ryzího serveru i z důvodů osobní filozofie a preferencí jsme se soustředili na programové vybavení běžící nad operačním systémem Linux a nejlépe volně použitelné a vytvářené jako projekt Open Source.

V komerční sféře se pro streamovací audiosystémy nejčastěji používá komerční produkt Shoutcast [8]. K němu existuje velmi dobrý ekvivalent icecast [9], vyvíjený jako Open Source. Každý z těchto produktů však podporuje pouze mp3 streamy. My jsme přesvědčeni o výhodách nového standardního formátu ogg a proto jsme zvolili aplikační server icecast2 [2], který jako zřejmě jediný podporuje oba formáty ogg i mp3. icecast2 je vyvíjen v rámci rodiny nových multimediálně zaměřených Open Source projektů pod názvem "Xiph.Org". Dosud nebyla uvolněna jeho oficiální verze a software je dostupný z vývojového CVS stromu anebo z neoficiálních archivů. To však nikterak nesnižuje kvalitu jeho kódu.

Zatímco výběr aplikace streamovacího serveru byl jednoznačný, volba aplikace kodéru je složitá v situaci, kdy požadujeme kódování do streamů o různých rychlostech (128 kb/s a 256 kb/s) a v různých formátech (mp3 a ogg) současně. Většina běžně používaných enkodérů umí zpracovávat jen statické soubory, encodéry pro živé vysílání (např. liveice) podporují jen formát mp3. Encodér ices2 vyvíjený pod projektem "Xiph.Org" podporuje ogg, ale nepodporuje živé kódování do mp3.

Použili jsme proto aplikaci DarkIce [1], která podporuje současné kódování živého vstupu do streamů o různých rychlostech a ve formátech mp3 i ogg a podporuje icecast2 server. Nevýhodou kodéru DarkIce je to, že doprovodné textové informace (např. název vysílaného programu) umí vkládat jen do mp3 streamu. Zaznamenali jsme rovněž potíže s jeho stabilitou v jádře řady 2.6.

Úvaha o rozdělení kódování ogg a mp3 streamů mezi dvě aplikace - ices2 pro ogg (podporuje vkládání metadat) a DarkIce pro mp3 naráží na to, že Linux dovolí otevřít zvukové zařízení přístupné přes OSS driver jen jedné aplikaci. To znamená, že bychom pro ogg a mp3 stream každé vysílané stanice museli mít jinou zvukovou kartu. Řešení by mohly přinést zvukové drivery Alsa, které by vícenásobné současné otevření a čtení zařízení měly nově podporovat. Ovšem aplikace otevírající zařízení musí Alsu podporovat přímo - tím je vybeven ices2, ale nikoli DarkIce. Cestou vícenásobného čtení z Alsa zvukového zařízení chceme v budoucnosti jít.

Experimentálně jsme také vyzkoušeli použití transkodéru streamTranscoder [10]. S jeho stabilitou jsme spokojeni nebyli. Podstatné je také jisté snížení kvality, které do výsledného streamu vnáší. To je dané samou podstatou jeho funkce, kdy původní analogový signál zakódovaný do jednoho ztrátového kompresního formátu (ogg nebo mp3) převádí zpět a následně kóduje do jiného ztrátového kompresního formátu.

Z důvodů využití progresivních vlastností jádra nové řady 2.6 i ověřování jeho stability jsme na obou serverech chtěli používat toto nové jádro, které se již blíží finální verzi. Na streamovacím serveru provozujeme bez potíží jádro 2.6.0-test5-bk3. Na kódovacím serveru jsme měli potíže se stabilitou aplikace DarkIce běžící nad jádrem 2.6.0-test5-bk3 a proto na něm provozujeme jádro 2.4.21-rc2-ac2.

Po zahájení aktualizace doprovodných textových informací - metadat, jsme zaznamenali potíže se stabilitou icecast2 serveru. Vývojáři oznámení této chyby akceptovali a nabídli nám testování opravené verze z neoficiálního archivu [11]. Tuto verzi používáme i v současnosti a je zcela stabilní.

Použitá literatura

[1] http://darkice.sourceforge.net/
[2] http://www.xiph.org/
[3] http://www.debian.org/
[4] http://www.rozhlas.cz/portal/vysilani
[5] http://www.oddsock.org/icecast2yp/
[6] http://dir.xiph.org/
[7] http://radio.cesnet.cz/
[8] http://www.shoutcast.com/
[9] http://www.icecast.org/
[10] http://www.oddsock.org/
[11] http://www.xiph.org/~karl/
[12] http://www.xiph.org/ogg/vorbis/listen.html
další weby:fond rozvojemetacentrumCzechLightpřenosyvideoservereduroameduID.cz