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/31 17:47]
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 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]]
  
  • project/audio_streaming.1472658453.txt.gz
  • Last modified: 2016/08/31 17:47
  • by dron