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 19:13] dron |
project:audio_streaming [2016/09/06 21:46] (current) 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 97: | 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 221: | 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 242: | 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 257: | 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]] | * [[https://rudd-o.com/linux-and-free-software/how-to-make-pulseaudio-run-once-at-boot-for-all-your-users]] | ||