Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
project:audio_streaming [2016/08/31 17:47] dron |
project:audio_streaming [2016/09/06 21:46] dron |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Audio streming ====== | ====== Audio streming ====== | ||
- | 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... | + | |**Project owner:**| [[user:dron]] | |
+ | |**Interested:** | | | ||
+ | |**Related:**| | | ||
+ | | **License:** | [[https://creativecommons.org/licenses/by-sa/3.0/|Uveďte původ-Zachovejte licenci CC BY-SA]] | | ||
- | TODO... | + | 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 ===== | ===== Setup ===== | ||
Line 10: | Line 13: | ||
* 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...) | * 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 audio mnoha připojeným klientům pomocí http. | + | * 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í... | 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í... | ||
Line 16: | Line 19: | ||
* Stage: | * Stage: | ||
* audio výstup z mixu, line-out | * audio výstup z mixu, line-out | ||
- | * PC bazmek s line-in vstupem (digitalizace, streaming) | + | * <del>PC bazmek s line-in vstupem</del> Raspberry PI s externí USB zvukovkou (digitalizace, streaming) |
* WiFi client | * WiFi client | ||
* Studio: | * Studio: | ||
Line 22: | Line 25: | ||
* PC bazmek s line-out výstupem (příjem streamu) | * PC bazmek s line-out výstupem (příjem streamu) | ||
* mix | * mix | ||
- | * ...co dál? TODO... | + | * výstup z mixu je už streamován na skutečný stream server |
===== WiFi ===== | ===== WiFi ===== | ||
Line 38: | Line 41: | ||
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. | 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). | ||
+ | |||
+ | <code> | ||
+ | lsusb | ||
+ | lsmod | grep snd.usb.audio | ||
+ | </code> | ||
+ | |||
+ | Vypsání audio výstupů | ||
+ | |||
+ | <code> | ||
+ | aplay -l | ||
+ | </code> | ||
+ | |||
+ | Vypsání audio vstupů | ||
+ | |||
+ | <code> | ||
+ | arecord -l | ||
+ | </code> | ||
+ | |||
+ | 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 ''<param name="device">hw:0,1</param>''). | ||
+ | |||
+ | <code> | ||
+ | yum install ices | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | nano /etc/ices.conf | ||
+ | </code> | ||
+ | |||
+ | <file> | ||
+ | <?xml version="1.0"?> | ||
+ | <ices> | ||
+ | <!-- run in background --> | ||
+ | <background>1</background> | ||
+ | <!-- where logs, etc go. --> | ||
+ | <logpath>/var/log/ices</logpath> | ||
+ | <logfile>ices.log</logfile> | ||
+ | <!-- 1=error,2=warn,3=info,4=debug --> | ||
+ | <loglevel>4</loglevel> | ||
+ | <!-- set this to 1 to log to the console instead of to the file above --> | ||
+ | <consolelog>0</consolelog> | ||
+ | |||
+ | <!-- optional filename to write process id to --> | ||
+ | <!-- <pidfile>/home/ices/ices.pid</pidfile> --> | ||
+ | |||
+ | <stream> | ||
+ | <!-- metadata used for stream listing (not currently used) --> | ||
+ | <metadata> | ||
+ | <name>Letni zver main stage stream</name> | ||
+ | <genre>Psychedelic</genre> | ||
+ | <description>Live stream from main stage of Letni zver 2016 festival...</description> | ||
+ | </metadata> | ||
+ | |||
+ | <input> | ||
+ | <module>alsa</module> | ||
+ | <param name="rate">44100</param> | ||
+ | <param name="channels">2</param> | ||
+ | <param name="device">hw:0,1</param> | ||
+ | <param name="periods">2</param> | ||
+ | <param name="buffer-time">500</param> | ||
+ | </input> | ||
+ | |||
+ | <instance> | ||
+ | <!-- icecast server, kam budeme audio posilat --> | ||
+ | <hostname>10.0.0.11</hostname> | ||
+ | <port>8000</port> | ||
+ | <password>heslo</password> | ||
+ | <mount>/letnizver.ogg</mount> | ||
+ | <reconnectdelay>2</reconnectdelay> | ||
+ | <reconnectattempts>5</reconnectattempts> | ||
+ | <maxqueuelength>80</maxqueuelength> | ||
+ | <encode> | ||
+ | <nominal-bitrate>64000</nominal-bitrate> <!-- bps. e.g. 64000 for 64 kbps --> | ||
+ | <samplerate>44100</samplerate> | ||
+ | <channels>2</channels> | ||
+ | </encode> | ||
+ | </instance> | ||
+ | |||
+ | </stream> | ||
+ | </ices> | ||
+ | </file> | ||
+ | |||
+ | a spustíme ices | ||
+ | |||
+ | <code> | ||
+ | ices /etc/ices.conf | ||
+ | </code> | ||
+ | |||
+ | ==== Pulse audio ==== | ||
+ | Situace spíše s plnotučnou moderní Linuxovou distribucí (např. Fedora). | ||
<code> | <code> | ||
Line 75: | Line 175: | ||
<param name="rate">44100</param> | <param name="rate">44100</param> | ||
<param name="channels">2</param> | <param name="channels">2</param> | ||
- | <param name="metadata">1</param> | ||
- | <param name="metadatafilename">/home/ices/metadata</param> | ||
</input> | </input> | ||
Line 99: | Line 197: | ||
</file> | </file> | ||
+ | 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''). | ||
<code> | <code> | ||
- | parec -d streaming.monitor --raw | ices /etc/ices.conf | + | pactl list short sources |
</code> | </code> | ||
+ | Poznámka: Pokud má source příponu ''.monitor'', tak se jedná o monitor (odposlech) toho, co hraje na odpovídajícím výstupu. | ||
- | ==== Debug ==== | + | 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]] |
- | pactl stat | + | Ices nemá podporu přímo pro Pulseaudio, ale lze to obejít pomocí modulu stdinpcm a posíláním audia do stdin ices. |
- | pactl list | less | + | |
- | v nejake verzi asi tez | + | <code> |
+ | parec -d alsa_input.pci-0000_00_1b.0.analog-stereo --raw | ices /etc/ices.conf | ||
+ | </code> | ||
- | pactl list short sinks | + | ==== Debug ==== |
+ | <code> | ||
tail -f /var/log/ices/ices.log | tail -f /var/log/ices/ices.log | ||
+ | </code> | ||
===== Studio ===== | ===== Studio ===== | ||
Line 223: | Line 325: | ||
Stream je pak dostupný na lokální adrese a portu 8000 např. přes browser. | 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,...) | ||
+ | |||
+ | <code> | ||
+ | ogg123 http://10.0.0.11:8000/letnizver.ogg | ||
+ | </code> | ||
==== Debug ==== | ==== Debug ==== | ||
Line 244: | Line 354: | ||
</code> | </code> | ||
- | ===== Poznámky ===== | + | ===== 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... | Tohle je jen dočasný bordel z předchozího pokusu. Protřídit TODO... | ||
Line 259: | Line 375: | ||
</code> | </code> | ||
- | + | seznam sinku na starsi verzi pactl | |
- | + | ||
- | <code> | + | |
- | /etc/ices.conf | + | |
- | </code> | + | |
- | + | ||
- | <file> | + | |
- | <input> | + | |
- | <module>stdinpcm</module> | + | |
- | <param name="rate">44100</param> | + | |
- | <param name="channels">2</param> | + | |
- | <param name="metadata">1</param> | + | |
- | <param name="metadatafilename">/home/ices/metadata</param> | + | |
- | </input> | + | |
- | + | ||
- | + | ||
- | <instance> | + | |
- | <hostname>stream.slu.cz</hostname> | + | |
- | <port>8000</port> | + | |
- | <password>********</password> | + | |
- | <mount>/dron.ogg</mount> | + | |
- | <reconnectdelay>2</reconnectdelay> | + | |
- | <reconnectattempts>5</reconnectattempts> | + | |
- | <maxqueuelength>80</maxqueuelength> | + | |
- | <encode> | + | |
- | <nominal-bitrate>64000</nominal-bitrate> <!-- bps. e.g. 64000 for 64 kbps --> | + | |
- | <samplerate>44100</samplerate> | + | |
- | <channels>2</channels> | + | |
- | </encode> | + | |
- | </instance> | + | |
- | </file> | + | |
- | + | ||
- | + | ||
- | spustit paman, Devices, najit odpovidajici sink, dat Properties, a zkopirovat si radek Monitor Source. | + | |
- | + | ||
- | pak tento source preposleme do ices (a ten to enkodne a posle do icecastu) | + | |
- | + | ||
- | <code> | + | |
- | parec -d alsa_output.pci-0000_00_1b.0.analog-stereo.monitor --raw | ices /etc/ices.conf | + | |
- | </code> | + | |
- | + | ||
- | <code> | + | |
- | yum install pulseaudio-utils paman ices icecast | + | |
- | </code> | + | |
- | + | ||
- | seznam sinku | + | |
<code> | <code> | ||
LANG=C pactl list | grep -A2 'Source #' | grep 'Name: ' | cut -d " " -f2 | LANG=C pactl list | grep -A2 'Source #' | grep 'Name: ' | cut -d " " -f2 | ||
</code> | </code> | ||
- | |||
- | <file> | ||
- | alsa_output.pci-0000_00_1b.0.analog-stereo.monitor | ||
- | alsa_input.pci-0000_00_1b.0.analog-stereo | ||
- | </file> | ||
- | |||
- | <code> | ||
- | parec -d alsa_input.pci-0000_00_1b.0.analog-stereo --raw | ices /etc/ices.conf | ||
- | </code> | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
===== Links ===== | ===== Links ===== | ||
* [[http://icecast.org/]] | * [[http://icecast.org/]] | ||
+ | * [[http://icecast.org/ices/docs/ices-2.0.2/inputs.html]] Nastavení Ices2 vstupů | ||
* [[https://openwrt.org/]] | * [[https://openwrt.org/]] | ||
+ | * [[https://rudd-o.com/linux-and-free-software/how-to-make-pulseaudio-run-once-at-boot-for-all-your-users]] | ||