====== Audio streming ======
|**Project owner:**| [[user:dron]] |
|**Interested:** | |
|**Related:**| |
| **License:** | [[https://creativecommons.org/licenses/by-sa/3.0/|Uveďte původ-Zachovejte licenci CC BY-SA]] |
Základní motivace tohoto projektu je realizace audio streamu ze stage do studia na jednom milém malém festivalu (Letní zvěř 2016). Nicméně tyto principy lze použít kdykoli na cokoli...
===== Setup =====
Možností a nástrojů jak dostat audio z jednoho místa na druhé je spousta. Zde několik, o kterých vím (určitě to nebude úplný seznam, klidně doplňte...). Samozřejmě se bavím pouze o otevřených systémech a aplikacích...
* PulseAudio - tento audioserver umí přímo vytvářet a připojovat vzdálené zdroje audio signálu. S úspěchem používám, ale na kabelu. Audio posílám nekomprimovaně, což je náročné na šířku pásma a chybovost média. Dost pravděpodobně naprosto nevhodné pro bezdrát (ale netestováno...)
* IceCast - stremingový server. Umí streamovat enkodované audio mnoha připojeným klientům pomocí http.
Co se týče konkrétně Letní zvěře, tak to zkusíme udělat s IceCastem a posléze se uvidí, jestli to bylo dobré řešení...
* Stage:
* audio výstup z mixu, line-out
* PC bazmek s line-in vstupem Raspberry PI s externí USB zvukovkou (digitalizace, streaming)
* WiFi client
* Studio:
* WiFi AP
* PC bazmek s line-out výstupem (příjem streamu)
* mix
* výstup z mixu je už streamován na skutečný stream server
===== WiFi =====
Nejjednodušší setup je klient - AP, ale aktuálně použijeme setup původně určený pro UfoBufo2016, což je na třech TP-Link TL-WDR4300 a OpenWRT postavené WDS. Milé je, že LAN porty jsou probridgeované s WLAN, tak stačí APčka zapnout a připojit na každé straně jedno PC (Stage a studio). Detailně popíšu jindy... TODO
==== Adresace ====
* WDS používá subnet 10.0.0.0/21 (255.255.248.0)
* 3 AP mají adresy 10.0.0.1 - 3
* PC Stage bude staticky 10.0.0.10/21
* PC Studio bude staticky 10.0.0.11/21
===== Stage =====
Na stage bude PC s Line-in vstupem z mixu. Budeme zde típat input source a posílat do ices, který to bude enkodovat a stremovat na druhou stranu do studia.
V Linuxu existuje docela dost audio serverů... Zmíním nastavení pro dva
==== Alsa sound ====
Tohle se bude týkat spíše varianty s RB Pi (a externí zvukovkou).
lsusb
lsmod | grep snd.usb.audio
Vypsání audio výstupů
aplay -l
Vypsání audio vstupů
arecord -l
Je potřeba si poznačit Card a Device numbers - alsa device ja pak označeno jako ''hw:Card,Device'' (např. ''hw:0,1'').
Nainstalujeme a připravíme config Ices (pozor na řádek ''hw:0,1'').
yum install ices
nano /etc/ices.conf
1/var/log/icesices.log40Letni zver main stage streamPsychedelicLive stream from main stage of Letni zver 2016 festival...alsa
44100
2
hw:0,1
2
500
10.0.0.118000heslo/letnizver.ogg258064000441002
a spustíme ices
ices /etc/ices.conf
==== Pulse audio ====
Situace spíše s plnotučnou moderní Linuxovou distribucí (např. Fedora).
yum install paman ices
nano /etc/ices.conf
0/var/log/icesices.log40Letni zver main stage streamPsychedelicLive stream from main stage of Letni zver 2016 festival...stdinpcm
44100
2
10.0.0.118000heslo/letnizver.ogg258064000441002
Nyní je potřeba zjistit, jaký source (vstup) budeme streamovat. Zajímá nás název source (druhý sloupec, např. ''alsa_input.pci-0000_00_1b.0.analog-stereo'').
pactl list short sources
Poznámka: Pokud má source příponu ''.monitor'', tak se jedná o monitor (odposlech) toho, co hraje na odpovídajícím výstupu.
Poznámka: Pokud bychom chtěli posílat přímo výstup nějaké konkrétní, audio výstup produkující, aplikace, tak viz. [[https://wiki.archlinux.org/index.php/PulseAudio/Examples#Monitor_specific_output]]
Ices nemá podporu přímo pro Pulseaudio, ale lze to obejít pomocí modulu stdinpcm a posíláním audia do stdin ices.
parec -d alsa_input.pci-0000_00_1b.0.analog-stereo --raw | ices /etc/ices.conf
==== Debug ====
tail -f /var/log/ices/ices.log
===== Studio =====
Ve studiu bude také PC, kde poběží Icecast...
yum install pulseaudio-utils icecast
nano /etc/icecast.xml
10025524288301510065535heslohesloadminheslolocalhost80001/usr/share/icecast/var/log/icecast/usr/share/icecast/web/usr/share/icecast/admin/var/run/icecast/icecast.pidaccess.logerror.log3100000icecasticecast
service icecast start
a bacha na firewall... (stopnout, nebo povolit přístup na port 8000/tcp)
service firewalld stop
nebo
service iptables stop
Stream je pak dostupný na lokální adrese a portu 8000 např. přes browser.
Tento setup stačí pro stremování audia mnoha dalším uživatelům - záleží na dosažitelnosti adresy icecast serveru.
Pokud chceme stream přehrát přímo na icecast serveru, pak např. utilitkou ogg123 (mpg123, mplayer,...)
ogg123 http://10.0.0.11:8000/letnizver.ogg
==== Debug ====
Poslouchá icecast na portu 8000?
netstat -lntp
...
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 3070/icecast
...
A co se děje v logu?
tail -f /var/log/icecast/*.log
===== Poznámky ze Zvěře =====
* Příště je potřeba dovézt uchozené a otestované kompletní řešení. Bastlit to na místě bylo mírně stresující...
* Reálně byl na stage použit malý NB s externí zvukovkou a streamerem BUTT. Problém byl s uchozením externí zvukovky na RbPi (aspoň v rámci časového presu - otestovat a dopsat TODO).
* WiFi fungovala bezproblémově, ale to se celkem čekalo, bylo to na cca 75m a přímou viditelnost ([[https://mapy.cz/s/12INt]])
* Nakonec byl místo ogg streamu použit mp3 192kbit stream. Ogg se z neznámých důvodů dost sekal (streamer bylo RbPi, které se ale nakonec nepoužilo)
* Na stage běžel Icecast na RbPi a load minimální (ale reálně byl jen 1 klient, ).
* Z nouze byl mezi Icecastem a mixem ještě vetknutý můj notebook, který přijímal stream a hrál jej pomocí mpg123 na lokální zvukovce.
==== tmp ====
Tohle je jen dočasný bordel z předchozího pokusu. Protřídit TODO...
instalace na labkovy centos6
yum install pulseaudio-utils icecast
yum localinstall ftp://ftp.pbone.net/mirror/li.nux.ro/download/nux/dextop/el6/i386/ices-2.0.1-10.el6.nux.i686.rpm
seznam sinku na starsi verzi pactl
LANG=C pactl list | grep -A2 'Source #' | grep 'Name: ' | cut -d " " -f2
===== Links =====
* [[http://icecast.org/]]
* [[http://icecast.org/ices/docs/ices-2.0.2/inputs.html]] Nastavení Ices2 vstupů
* [[https://openwrt.org/]]
* [[https://rudd-o.com/linux-and-free-software/how-to-make-pulseaudio-run-once-at-boot-for-all-your-users]]