Dnes si ukážeme ako zrealizovať vlastný audio-streamovací systém, pričom využijeme nástroje, ktoré sú dostupné zdarma a sú pomerne jednoduché na používanie a predovšetkým bežia na Windowse, avšak majú podporu aj pre Linux operačné systémy. Takýto systém umožní streamovanie hlasu skrz mikrofón, alebo streamovanie hudby, ktorá môže byť dostupná v LAN sieti, alebo na internete v závislosti od konfigurácie servera. Pri tomto systéme budeme brať ohľad aj na integráciu mikrokontroléra ESP32, ktorý bude prehrávať stream, avšak treba poznamenať, že je možné využiť aj softvér na počítači na účel klienta, ktorý prehráva stream. Stream preto prispôsobíme možnostiam a obmedzeniam mikrokontroléra.
Čo budeme potrebovať pre audio-stremovací systém?
- Zdrojový klient (dodáva audio zložku)
- Audio server (prijíma audio zložku a distribuuje ju koncovým klientom)
- Koncový klient (poslucháč)

Pre audio server využijeme program Icecast, čo je server umožňujúci streamovanie audio/video obsahu. Podporuje .ogg, .webm, či .opus formát a neoficiálne aj .mp3, či .aac formáty. Je to softvér odporúčaný na webrádio, rozhlas, DIY projekty či akékoľvek audio aplikácie, ktoré vyžadujú streamovanie audia ku klientom. Vo svojej podstate Icecast vytvára server, ktorý je dostupný na porte 8000. Tento server je veľmi populárny.

Spúšťa sa skrz .bat súbor a má vlastný .xml súbor, ktorý obsahuje prihlasovacie mená a heslá do webovej administrácie, či pre pripojenie zdrojového klienta, ktorý poskytuje audio zložku. Pre zdrojového klienta platia aj ďalšie parametre, ktoré pri pripájaní definuje, ako mountpoint (stream path), formát streamu, alebo aj iné formy rozšírenej autentifikácie, ktoré Icecast môže vyžadovať.

Icecast po inštalácii nevyžaduje prakticky žiadne úvodné nastavenie (ale odporúča sa vykonať) a dá sa rovno spustiť. Beží v konzolovom okne. Pri priamom spustení Icecastu bez zmien v .xml uvidíte okrem toho, že aplikácie beží na porte 8000 aj pár varovaní ohľadom nedefinovaných položiek ako hostname, location a nedefinovaný administrátorský email v príslušných položkách .xml súboru. Klienti pripojení na mountpoint (stream), dostanú zo servera to, čo tam od zdrojového klienta príde. Spomínané heslá, prihlasovacie mená sú v .xml súbore definované, no na prvú môžu pôsobiť dosť chaoticky, nakoľko je tam viackrát použité heslo "hackme" pre rôzne veci.

Aký softvér pre zdrojového klienta?
To bude závisieť od toho, aký bude účel použitia. Ak sa bavíme len o priamom streamovaní audia jedného zdroja, napríklad mikrofónu, či reproduktorov, odporúčam nástroj BUTT (Broadcast Using This Tool). V konfigurácii si nastavíte formát streamu, bitrate, hardvérový vstup (alebo aj výstup). Okrem streamovania na Icecast je možné streamovať aj na služby Shoutcast, či WebRTC. Po výbere služby nastavíte aj údaje o serveri, porte a tiež používateľské meno, heslo a mountpoint, na ktorý sa budú pripájať klienti, ktorí majú záujem počúvať váš zdroj. Limitom BUTT-u je predovšetkým to, že skrz neho nemôžete streamovať konkrétny audio súbor, napr. .mp3 track. Streamovanie je vždy viazané na zdroj. Samozrejme zdrojom môže byť aj iný mixovací softvér, kde si môžete pripraviť to, čo sa odstreamuje. Teda aj z tohto hľadiska je možné prehrávať to, čo potrebujete, ale priamo len cez BUTT to neurobíte, musíte si vytvoriť virtuálny audio zdroj.



Pre mnohých by mohol byť zaujímavý aj nástroj VLC Media Player. Áno, skutočne to nie je len Player, ale aj Streamer. Mnohí vedia, že skrz VLC sa dajú pozerať online streamy filmov. Pri otvorení Médium --> Stream je možné vytvoriť playlist, ktorý sa bude prehrávať. Môžete ho naplniť ľubovoľnými .mp3 súbormi. V ďalšom kroku musíte vybrať server, na aký bude streamovanie prebiehať. K dispozícii sú rôzne vrátane HTTP, RTP, RTSP či WMSP, ale tiež Icecast. Následná ponuka vyžaduje zadanie adresy, portu, mountpointu, prihlasovacieho mena a hesla vo formáte HTTP Basic Auth.

Ďalej je často používaný nástroj Liquidsoap, ktorý sa radí k profesionálnym a automatizovaným nástrojom. Ide ale o scriptovací nástroj s vlastným doménovo-špecifickým scriptovacím jazykom, nečakajte teda grafické rozhranie na štýl VLC, či BUTT. Liquidsoap umožňuje aj prehrávanie konkrétneho audio súboru, či súborov v rámci zložky. To ale nie je všetko. Umožňuje vytváranie prechodov, špecifických playlistov, ktoré môžu byť aktívne na základe času, mixovanie mikrofónu do bežiaceho audia, vkladanie reklamných spotov a vytvorenie prakticky 24/7 bežiacieho audio streamu, o ktorý sa ani nemusíte starať a stále bude niečo hrať na základe nastavených pravidiel. Streamovanie nemusí byť viazané iba na jeden server, ale je možné streamovať aj na rôzne servery, napr. rôzne žánre a podobne. Je potrebná znalosť scriptovania a tak nemusí byť Liquidsoap najlepšia voľba pre začiatočníka.
Pre pokročilých používateľov odporúčam nástroj Mixxx. Je to nástroj pre DJ-ov, ale umožňuje aj streamovanie na Icecast službu. Okrem toho má rôzne nástroje, ktoré si obľúbite nielen vy, ale aj poslucháči. Ide napríklad o dynamické vyrovnanie hlasitosti pri prehrávaní z playlistu. Vďaka tomu nebude jedna stopa príliš tichá a druhá príliš hlučná a tiež podporuje crossfading pre plynulý prechod medzi skladbami playlistu. Výhodou je aj vstavaný softvérový mixér až pre 4 audio vstupy súčasne. Vďaka tomu môže hrať naživo celá kapela a mixér sa postará o zmixovanie audia, bez potreby využitia hardvérového mixéra.
V závislosti od nastavenia konkrétneho softvéru pre zdrojového klienta, počtu vstupov a podobne sa môže predĺžiť odozva, kedy bude koncový klient počuť audio.
Koncový klient (poslucháč)
U koncového klienta máme mnoho možností v závislosti od architektúry zariadenia, na ktorom sa audio stream bude prehrávať. Ak sa bavíme o počítačoch a operačnom systéme Windows, mnoho ľudí siahne po prehliadači, kde si danú URL adresu zadajú do riadka a počúvajú audio priamo z karty prehliadača, až kým ju nezatvoria. Iní majú určite v obľube VLC. Mnoho študentov pozná VLC práve z internátov, kde sa takýmto spôsobom okrem rádii šíria aj televízne programy, filmy, seriály, či iný obsah.

Teraz prichádzame na gro v podobne mikrokontrolérov ESP32, kde máme isté limity a to ako hardvérovo, tak aj softvérovo. Knižnica ESP32-audioI2S (hlavičkový súbor Audio.h), ktorú mám rád z pohľadu ľahkého použitia podporuje .aac, .ogg a .mp3 streamy. Odpadá preto podpora ďalších formátov, ktoré podporuje Icecast a to .opus, či .webm. Asi nemusím dodať, že pre akýkoľvek prehrávaný audio stream na strane ESP32 bez ohľadu na bitrate je nutné zvoliť ESP32 kontrolér s PSRAM pamäťou a mať ju zapnutú aj v nastaviach Arduino IDE, resp. vo frameworku ESP-IDF a jeho menuconfigu! A rovnako tak, keďže ide o I2S (Audio) knižnicu, tak potrebujete DAC prevodník. V mojom prípade som sa stretol len s MAX98357, ktorý podporuje ako mono, tak aj stereo zvuk.

Hardvér si môžete zostaviť z ESP32 devkitov a samostatného MAX98357 modulu, alebo môžete siahnuť aj po hotovom riešení. Odporúčam Loud ESP32 (pasuje to Rpi 3 krabičky), prípadne kompaktnejšiu YB-ESP32-S3-AMP. Obe dosky majú podporu stereo zvuku s ľavým a pravým kanálom. Obe dosky existujú aj so SPI Ethernet konektivitou (u Loud ESP32 je možné dospájkovať Ethernet komponent, u YB existuje samostatná verzia DPS). Prečo nie je k dispozícii PHY Ethernet? Je to jednoduché. Obe sú postavené na ESP32-S3, ktoré nemá RMII rozhranie. To je len u ESP32-WROOM-32 (najpoužívanejšie ESP32).


Na základe vytvorenej aplikácie môžete automaticky prehrávať stream z lokálneho / internetového Icecast servera. V závislosti na aplikácii sa nemusí 24/7 niečo prehrávať. Server môže bežať, klient naň môže byť pripojený a až niečo príde od zdrojového klienta, prehrá sa to na koncovom zariadení. Práve to môže byť fajn na informačný systém v rámci budovy pre kancelárie, vyhlásenie všeobecnej informácie.
Pár prípadov použitia:
Predstavte si, že prídete k lekárovi, zubárovi. V čakárni hrá tichá, príjemná hudba a zrazu sa ozve krátky tón, po ktorom sa oznámi vaše číslo pod ktorým čakáte v čakárni – žiadne chaotické vyvolávanie, všetko beží automaticky. Alebo airsoftová akcia – hráči sú rozmiestnení po ihrisku a organizátor jedným klikom dokáže cez rozhlas vyhlásiť krátku správu, upozornenie hráča na porušenie pravidla, ukončenie hry a podobne.
Rovnako tak môže prehrať tón signalizujúci koniec hry, sirénu. V obchodoch a reštauráciách zas môže systém počas dňa púšťať hudbu alebo rádio a v správny moment vložiť reklamný spot na ponúkaný tovar z katalógu / denného menu, ktorý zákazníka osloví priamo na mieste. Rovnako tak môže byť systém použitý ako rozhlas vo firme, kde je v každej kancelárii prehrávač umiestnený na strope a v prípade potreby prehrá audio zložku z Icecast servera.
Knižnica ESP32-audioI2S umožňuje kontrolovať aj hlasitosť. ESP32 pri pripájaní na stream, musí použiť URL, ktorý obsahuje IP adresu, alebo hostname Icecast servera. Prípadne ak to podporuje, tak je možné zadať aj mDNS záznam. ESP32 nemôže použiť localhost, keďže stream nebeží na ňom. To môže urobiť akurát zdrojový / koncový klient, ktorý beží na rovnakom počítači, ako Icecast server.

V minulosti som si vytvoril jednoduchú HTML5, Bootstrap 5.3.2 aplikáciu, ktorá beží na webserveri v ESP32. Mám v nej preddefinované obľúbené streamy a tiež možnosť zadania presnej URL adresy, čo mi umožňuje prehrať čokoľvek, aj internetové rádio z druhého konca sveta. Rovnako tak mám možnosť webaplikáciu navštíviť skrz mDNS záznam. Spomenutá doska Loud ESP32 umožňuje naspájkovanie IR prijímača (TSOP1738, alebo TSOP1838), vďaka čomu môžete akýkoľvek ovládač (od TV, klimatizácie, či univerzálny) použiť pre ovládanie hlasitosti, či zmeny stanice zo zoznamu.

Vďaka tomu môže byť k dispozícii aj viacero Icecast mountpointov rozdelených podľa žánrov a vy si budete medzi nimi prepínať podľa toho čo preferujete a na čo máte chuť. V jednej miestnosti vám môže koncový klient prehrávať Jazz, zatiaľ čo v izbe pubertiaka rap a streamy pobežia z rovnakého Icecast servera s viacerými mountpointami.

Ak ste si už Loud ESP32 zakúpili, napríklad na Tindie, tu je pinout, ktorý použijete v programe. Ako je vidieť, potrebujete použiť aj EN pin pre jeho zapnutie, nakoľko na DPS nemá priamo pripojené napájanie do EN pinu:
- I2S_DOUT 16
- I2S_BCLK 14
- I2S_LRC 15
- DAC_EN 8
V programe zavoláte v setupe nasledujúce príkazy:
pinMode(DAC_EN, OUTPUT);
digitalWrite(DAC_EN, HIGH); //pre zapnutie DAC
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
K Loud ESP32 môžete pripojiť štandardné reproduktory,najčastejšie dostupné 2W, alebo 3W. V prípade, že zapojíte jeden, máte mono zvuk, ak zapojíte oba, máte stereo s ľavým a pravým kanálom.
Základným programom ESP32 pre prehrávanie zvuku (bez webservera, GUI) sa môžete inšpirovať z:
https://circuitdigest.com/microcontroller-projects/esp32-based-internet-radio-using-max98357a-i2s-amplifier-board