Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
project:audio_streaming [2016/08/30 00:10]
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 =====
  
-Tohle se týká ​konkrétně ​Letné ​zvěře a musí se to doplnitTODO+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 ​posléze ​se uvidí, jestli ​to bylo dobré řešení...
  
   * 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 17: 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 =====
 +
 +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 ===== ===== Stage =====
  
-===== Studio =====+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.
  
-===== Poznámky =====+V Linuxu existuje docela dost audio serverů... Zmíním nastavení pro dva
  
-Tohle je jen dočasný bordel z předchozího pokusu. Protřídit TODO...+==== 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>​ <​code>​
-/​etc/​ices.conf+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>​ </​code>​
  
 <​file>​ <​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>​ <​input>​
-    <​module>​stdinpcm</​module>​+    <​module>​alsa</​module>​
     <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="device">hw:0,1</​param>​ 
-    <param name="metadatafilename">/home/​ices/​metadata</​param>​+    <param name="periods">2</param> 
 +    <param name="​buffer-time">​500</​param>​
 </​input>​ </​input>​
- 
  
 <​instance>​ <​instance>​
-    <​hostname>​stream.slu.cz</​hostname>​+    ​<!-- icecast server, kam budeme audio posilat --> 
 +    ​<​hostname>​10.0.0.11</​hostname>​
     <​port>​8000</​port>​     <​port>​8000</​port>​
-    <​password>​********</​password>​ +    <​password>​heslo</​password>​ 
-    <​mount>/​dron.ogg</​mount>​+    <​mount>/​letnizver.ogg</​mount>​
     <​reconnectdelay>​2</​reconnectdelay>​     <​reconnectdelay>​2</​reconnectdelay>​
     <​reconnectattempts>​5</​reconnectattempts>​     <​reconnectattempts>​5</​reconnectattempts>​
Line 59: Line 125:
     </​encode>​     </​encode>​
 </​instance>​ </​instance>​
 +
 + </​stream>​
 +</​ices>​
 </​file>​ </​file>​
  
 +a spustíme ices
  
-spustit paman, Devices, najit odpovidajici sink, dat Properties, a zkopirovat si radek Monitor Source.+<​code>​ 
 +ices /etc/ices.conf 
 +</​code>​
  
-pak tento source preposleme do ices (a ten to enkodne a posle do icecastu)+==== Pulse audio ==== 
 +Situace spíše s plnotučnou moderní Linuxovou distribucí ​(např. Fedora).
  
 <​code>​ <​code>​
-parec -d alsa_output.pci-0000_00_1b.0.analog-stereo.monitor --raw | ices /​etc/​ices.conf+yum install paman ices
 </​code>​ </​code>​
  
 <​code>​ <​code>​
-yum install pulseaudio-utils paman ices icecast+nano /etc/ices.conf
 </​code>​ </​code>​
  
-seznam sinku+<​file>​ 
 +<?xml version="​1.0"?>​ 
 +<​ices>​ 
 +    <!-- run in background --> 
 +    <​background>​0</​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>​stdinpcm</​module>​ 
 +    <param name="​rate">​44100</​param>​ 
 +    <param name="​channels">​2</​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>​ 
 + 
 +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>​
-LANG=C ​pactl list | grep -A2 '​Source #' | grep 'Name: ' | cut -d " " -f2+pactl list short sources
 </​code>​ </​code>​
  
-<​file>​ +Poznámka: Pokud má source příponu ''​.monitor'',​ tak se jedná o monitor (odposlech) toho, co hraje na odpovídajícím výstupu. 
-alsa_output.pci-0000_00_1b.0.analog-stereo.monitor + 
-alsa_input.pci-0000_00_1b.0.analog-stereo +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]] 
-</file>+ 
 +Ices nemá podporu přímo pro Pulseaudio, ale lze to obejít pomocí modulu stdinpcm a posíláním audia do stdin ices.
  
 <​code>​ <​code>​
Line 89: Line 213:
 </​code>​ </​code>​
  
 +==== Debug ====
  
 +<​code>​
 +tail -f /​var/​log/​ices/​ices.log
 +</​code>​
  
 +===== Studio =====
 +
 +Ve studiu bude také PC, kde poběží Icecast...
 +
 +<​code>​
 +yum install pulseaudio-utils icecast
 +</​code>​
  
 <​code>​ <​code>​
Line 117: Line 252:
  
     <​authentication>​     <​authentication>​
-        <​source-password>​*******</​source-password>​ +        <​source-password>​heslo</​source-password>​ 
-        <​relay-password>​*******</​relay-password>​+        <​relay-password>​heslo</​relay-password>​
  
         <​admin-user>​admin</​admin-user>​         <​admin-user>​admin</​admin-user>​
-        <​admin-password>​*******</​admin-password>​+        <​admin-password>​heslo</​admin-password>​
     </​authentication>​     </​authentication>​
  
Line 174: Line 309:
  
 <​code>​ <​code>​
-systemctl start icecast+service ​icecast ​start
 </​code>​ </​code>​
  
 +a bacha na firewall... (stopnout, nebo povolit přístup na port 8000/tcp)
  
 +<​code>​
 +service firewalld stop
 +</​code>​
  
 +nebo
 +
 +<​code>​
 +service iptables stop
 +</​code>​
 +
 +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 ====
 +
 +Poslouchá icecast na portu 8000?
 +
 +<​code>​
 +netstat -lntp
 +</​code>​
 +
 +<​file>​
 +...
 +tcp        0      0 0.0.0.0:​8000 ​           0.0.0.0:​* ​              ​LISTEN ​     3070/​icecast
 +...
 +</​file>​
 +
 +A co se děje v logu?
 +
 +<​code>​
 +tail -f /​var/​log/​icecast/​*.log
 +</​code>​
 +
 +===== 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
 +
 +<​code>​
 +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
 +</​code>​
 +
 +seznam sinku na starsi verzi pactl
 +
 +<​code>​
 +LANG=C pactl list | grep -A2 '​Source #' | grep 'Name: ' | cut -d " " -f2
 +</​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]]
  
  • project/audio_streaming.1472508636.txt.gz
  • Last modified: 2016/08/30 00:10
  • by dron