Hallo in die Streaming-Runde
Ich spiele im Moment mit einem server-client-setup. Der Server ist ein Laptop, der Client ist Teil eines Mehrwege-Lautsprechers. Laptop-Server und Lautsprecher-Client kommunizieren über das Netzwerk. Das ganze funktioniert einwandfrei dank der von frankl zur Verfügung gestellten Programme writeloop und catloop.
Serverseitig werden wie gewohnt die gewünschten Musikquellen ausgewählt und abgespielt, seien es Youtube-Inhalte, die Naxos Library, eine lokale *wav-Sammlung via MPD oder via Aplay. Die Wiedergabe erfolgt jedoch nicht lokal über die Soundkarte auf dem Server, sondern wird mittels einer spezifischen ALSA-Konfiguration in eine Pipe geleitet. Diese Pipe wird an einen Puffer weitergegeben, welcher mittels writeloop aufgesetzt wird. Writeloop stellt die erste Portion Audiodaten solange im shared memory /dev/shm bereit, bis sie abgerufen werden. Diese Files werden in der Folge von catloop gelesen und an sox (Formatkonvertierung), dann an brutefir (loco & drc), weiter an volrace (volume control & race) und schliesslich an netcat weitergegeben.
1. Audioquelle -> writeloop
2. catloop -> sox -> brutefir -> volrace -> ncat.
Clientseitig wird mittels ncat der Port des Servers abgefragt. Sobald Daten anstehen, gibt ncat die information an brutefir (x_over), dann an sox, weiter an playhrt zur Mehrkanalsoundkarte weiter.
ncat -> brutefir -> sox -> playhrt -> [Soundkarte]
Damit lässt sich ein System aufbauen, welches im ersten Rechner, z.B. einem Laptop mit Browser, alles beinhaltet, um zunächst einen 2-Kanal-Audiostream ans Netz bereitzustellen. Der zweite Rechner ist lautsprecherseitig, resp. gehört zum aktiven Lautsprecher, lauscht ständig am Netz und verarbeitet die Audio-Informationen, sobald welche zur Verfügung stehen.
Um eine möglichst sorgfältige Bearbeitung der Audioinformationen zu gewährleisten, arbeiten beide Brutefirs und Volrace mit dem Format 192000/64. Das ist denn auch das Format des 2-Kanal-Datenstroms, welcher über das Netz geht.
Kernstück für das Ganze ist die Datei .asoundrc, welche im Heimverzeichnis des users im Server zu stehen kommt. Damit wird die Audio-Standardausgabe nicht an die lokale Soundkarte geführt, sondern als Pipe writeloop zugeführt:
Code: Alles auswählen
# Alsa stdout-to-pipe
pcm.!default {
type file
slave {
pcm null
}
file " | sudo chrt -r 90 taskset -c 1 writeloop --block-size=2000 --file-size=65536 --force-shm --shared /wlp.1 /wlp.2 /wlp.3"
format "raw"
}
pcm.null {
type null
}
That's it. Ich bin vorerst einmal völlig happy damit.
Streamkonfigurierte Grüsse
Simon