Mumble Musik Bot selbstgebaut

Beitrag vom 12.07.2015

Am Wochenende kam in einer Mumble Session die Idee auf, einen Musik Bot einzurichten. Man soll dabei eine Playlist erstellen können, welche per Zufall wiedergegeben werden soll.

Ich wollte dabei auf irgendwelche ominöse Programme verzichten und das komplett mit Linux Boardmitteln lösen. Ergebnis ist nun eine (bekloppte) Kombination aus zwei VLC Instanzen, Pulseaudio, ein Shellscript und dem Mumble Client.

Workflow

Pulseaudio erstellt eine virtuelle Soundkarte. VLC nutzt diese Soundkarte als Ausgabegerät. In Mumble wird dann die gleiche Soundkarte als Eingabegerät verwendet. Nach weiteren Einstellungen in Mumble wird die Ausgabe von VLC 1:1 an Mumble weitergegeben.

Linux Server mit MP3 Dateien --> VLC Mediaplayer ---|
|---------------------------------------------------|
|--> Virtuelle Pulseaudio Soundkarte --> Mumble
                                     --> VLC Stream Server

Später kam dann noch der Wunsch den gleichen Stream auch lokal via VLC hören zu können. Das wird mit einer weiteren VLC Instanz auf dem Server gelöst, die einen MP3 Stream erstellt.

Für die Veröffentlichung wird nginx genutzt, der den Stream passwortgeschützt unter einer speziellen Domain auf Port 80 und 443 zur Verfügung stellt.

VNC

Für das ganze wird ein VNC Server benötigt, da der Mumble Client ohne X nicht starten will. Der VNC Server ist so konfiguriert und mit iptables abgesichert, dass dieser nur über eine IP Adresse erreichbar ist.

Auf dem Server mit dieser IP Adresse läuft dann ein Guacamole Server welcher den Zugriff komfortabel über den Browser ermöglicht. Guacamole habe ich wegen einiger anderer Projekte bereits laufen gehabt, weswegen sich das anbot.

Natürlich könnte man die Verbindung auch mit einem SSH Tunnel absichern und auf Guacamole verzichten.

Ein Nebeneffekt dieser Konfiguration ist, dass die Verwaltung der Playlist und der Musikdateien erheblich einfacher ist, als es über das Webinterface oder die Shell der Fall wäre.

Pulseaudio Einrichtung

PulseAudio läuft auf den meisten Linux Systemen unter jedem Benutzer separat. Aus dem Grund können folgende Befehle einfach in einer normalen Shell ausgeführt werden.

pactl load-module module-null-sink sink_name=mumble_null sink_properties=device.description="mumble_null_sink"
pactl load-module module-null-sink sink_name=mpdmumble sink_properties=device.description="mpdmumble_sink"

Die Befehle erstellen zwei Geräte. Eines für Mumble, dass andere für $MEDIAPLAYER. Alles weitere kann über pavucontrol Konfiguriert werden.

  • VLC starten und Musik abspielen
  • VLC in pavucontrol unter "Playback" das Gerät mpdmumble_sink zuweisen
  • Mumble starten
  • Input und Output auf PulseAudio setzen
  • Ausgabegeräte in Mumble auf mumble_null_sink setzen
  • Die Übertragung auf Dauerhaft einstellen
  • Qualität auf Maximum
  • Rauschunterdrückung ausschalten
  • Maximale Verstärkung auf die kleinste Einstellung
  • Mumble in pavucontrol unter "Recording" das Gerät Monitor of mpdmumble_sink zuweisen

via David Mohr

Nun sollte man in dem Kanal indem sich der Musik Bot befindet Musik hören. Anschließend kann man in pavucontrol die Lautstärke des Mumble Rekorders so regulieren, dass die Musik im Channel nicht stört. Um die 40% ist dabei ein guter Wert.

VLC behält 100% Laustärke, da der Stream ja auch noch als MP3 Stream veröffentlicht werden soll. Ansonsten ist der MP3 Stream viel zu leise.

Web Stream einrichten

Hier wird einfach das Streaming Feature von VLC verwendet. VLC kann, genau wie Mumble, den Sound des Pulseaudio Monitors abgreifen. Dieser wird dann als MP3 gestreamt.

cvlc -vvv pulse://mpdmumble.monitor --volume 2048 --sout '#transcode{acodec=mp3,ab=128,channels=2}:standard{access=http,dst=127.0.0.1:8085/stream/stream.mp3}'

In meinem Fall lief auf der Maschine bereits ein nginx Webserver. Aus dem Grund wird der Stream über das Proxy Feature von nginx in das Internet geleitet.

Gleichzeitig sorgt nginx für die Absicherung des Streams via Benutzername und Kennwort.

server {
   [...]
   location = /stream/stream.mp3 {
      proxy_pass http://127.0.0.1:8085;
      proxy_redirect off;
      proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      auth_basic "My Stream";
      auth_basic_user_file /etc/nginx/stream.passwd;
   }
   [...]
}

Nun kann der Stream ganz normal auf einer beliebigen Maschine über eine http:// oder https:// Adresse aufgerufen werden. Voraussetzung sind natürlich die Zugangsdaten.

VLC Fragt beim Anruf des Streams nach dem Benutzernamen und dem Kennwort. Bei einigen anderen Playern müssen die Zugangsdaten mit in die URL gepackt werden.

https://benutzer:password@stream.example.com/stream/stream.mp3

Wiedergabe im Browser

Die meisten modernen Browser unterstützen das HTML5 <audio> Tag. Das kann in vielen Fällen auch Streams abspielen. So kann man ohne Flash oder Ähnliches den Stream abspielen.

<audio controls="controls" preload="auto" src="/stream/stream.mp3" type="audio/mpeg"></audio>

Es bietet sich dabei an, die HTML Datei unter der gleichen Domain zu hinterlegen wie auch den Stream selbst. Dann gibt es kein Problem mit der Authentifizierung und der Stream sollte ohne Probleme laufen.

Weitere Ideen

  • Webinterface für den VLC Player aktivieren und wie den Stream über nginx verfügbar machen
  • XML Schnittstelle des Webinterface nutzen, um eine Historie zu bauen (letzte 200 Tracks)
  • Einigen Usern die Möglichkeit geben, über das Webinterface die Wiedergabeliste zu verwalten

Have fun.

Hallo Internet

Mein Name ist Christian, vom Beruf bin ich Anwendungsentwickler.

In meiner Freizeit beschäftige ich mich mit verschiedensten Technologien. Hier sammele ich Dinge, die für mich interessant waren oder sind.