Wir kennen es alle: beim Anruf auf die Nummer einer Firma, eines Dienstleisters oder einer Hotline werden wir mit einer freundlichen Stimme begrüsst, die uns versichert, dass wir «gleich verbunden» werden. In den meisten Fällen ist in der Folge solange Musik zu hören, bis jemand den Anruf entgegennimmt. Dienstleister und Warenhäuser nutzen die Pausen auch, um Werbung einzustreuen; beim Weltbild Verlag beispielsweise sind alle 60 Sekunden Hinweise auf neue Produkte oder Aktionen zu hören.
In der Fachsprache wird diese Hintergrundmusik auch «Music on Hold» (Wartemusik) oder kurz MOH genannt. Bei Asterisk gibt es eine ganze Palette an Funktionen, um Hintergrundmusik zu verwenden. Üblicherweise wird Haltemusik dann genutzt, wenn auf eine Gruppennummer (Queue) angerufen wird: mit einer gegebenen «Strategie» läuten nun mehrere Telefone solange, bis jemand den Hörer abnimmt oder bis eine Zeitlimite überschritten wird. Wartemusik kann aber auch bei einem simplen Dial() Kommando verwendet werden. Im zweiten Teil meiner Asterisk-Einführung habe ich einen einfachen Wählplan verwendet, der im Folgenden um eine Wartemusik erweitert werden soll: sobald die Nummer 032 517 81 80 gewählt wird, läuten die beiden angeschlossenen Telefone und der Anrufende hört Musik, solange bis jemand abnimmt. Ich möchte im Folgenden sogar noch einen Schritt weiter gehen und nicht einfach eine statische Hintergrundmusik verwenden, die in einer oder in mehreren MP3 Dateien gespeichert ist. Es soll im folgenden Beispiel Musik vom Sender «SwissPop» verwendet werden. SwissPop stellt einen 128kbit MP3 Stream zur Verfügung, den wir für unsere Zwecke nutzen können.
Leider ist die MOH-Dokumentation etwas fragmentarisch. Deshalb folgt hier ein kurzer (aber wiederum nicht vollständiger) Abriss der Möglichkeiten: Asterisk verwendet sogenannte Klassen, um Wartemusik zu konfigurieren. Eine Klasse besteht entweder aus einer Gruppe von Dateien oder aus einer URL, von der die Musik zu beziehen ist. Ebenso kennt Asterisk zwei Verfahren, um Musik abzuspielen: Die Verwendung einer internen Wiedergabe oder ein externes Programm, das die Mediendateien wiedergibt. Am besten ist es wohl, bei einem ganz simplen Beispiel zu beginnen, das in der Konfigurationsdatei musiconhold
zu finden ist:
[default]
mode=quietmp3
directory=/usr/local/share/asterisk/moh
In diesem Beispiel müssen die abzuspielenden MP3-Dateien im Ordner /usr/local/share/asterisk/moh gespeichert werden. quietmp3 spielt die Dateien in diesem Ordner dann in sequentieller Folge ab und gibt sie mit einer reduzierten Lautstärke wieder. Anstelle von quietmp3 könnte auch mp3 geschrieben werden: Wiedergabe mit unveränderter Lautstärke. Soll ein eigenes Wiedergabeprogramm zum Einsatz kommen, muss als Modus custom angegeben werden. Und es muss zusätzlich der zu verwendende Player angegeben werden. Im folgenden Beispiel ist es das bekannte mpg123 Tool:
[manual]
mode=custom
directory=/usr/local/share/asterisk/mohmp3
application=/usr/bin/mpg123 -q -r 8000 -f 8192 -b 2048 --mono -s
Wichtig: Bei der Verwendung externer Programme muss darauf geachtet werden, dass ein Audio-Stream erzeugt wird, der von Asterisk verwendet werden kann. mpg123 wird in diesem Beispiel mit folgenden Argumenten aufgerufen, um einen kompatiblen Stream zu erzeugen:
-q: Quiet. Damit werden Meldungen von mpg123 unterdrückt
-r 8000: Verwendet eine Bitrate von 8kbps
-b 2048: Puffergrösse für die Wiedergabe festlegen
–mono: Wiedergabemodus ist mono
-s: Ausgabe in Datei. In diesem Fall an eine Asterisk-Pipe, um die wir uns im Moment nicht weiter zu kümmern brauchen
Die abzuspielenden MP3-Dateien werden im Ordner /usr/local/share/asterisk/mohmp3
erwartet. Damit haben wir das nötige Rüstzeug zusammen, um eine eigene Wartemusik zusammenzustellen. Wir verwenden dazu wie schon erwähnt einen MP3-Stream von SwissPop, der zurzeit hier zu finden ist:
http://www.radioswisspop.ch/live/mp3.m3u
Nun ist dies noch kein MP3-Stream, sondern eine MP3-Playlist (M3U), also eine Liste mit möglichen Stream-Adressen. Wenn wir einen Blick in diese Datei werfen, sehen wir in der Tat folgendes:
http://stream-x.ssatr.ch:80/rsp/mp3
http://stream-10.ssatr.ch:80/rsp/mp3
http://stream-6.ssatr.ch:80/rsp/mp3
http://stream-7.ssatr.ch:80/rsp/mp3
http://stream-11.ssatr.ch:80/rsp/mp3
http://stream-4.ssatr.ch:80/rsp/mp3
http://stream-1.ssatr.ch:80/rsp/mp3
http://stream-2.ssatr.ch:80/rsp/mp3
http://stream-5.ssatr.ch:80/rsp/mp3
http://stream-3.ssatr.ch:80/rsp/mp3
Hinweis: Um die Liste als Textdatei herunterzuladen kann ein Utility wie fetch oder wget verwendet werden. Oder einfach im Browser mit der rechten Maustaste auf den Link klicken und dann «Link speichern unter» wählen.
Leider können nicht alle Versionen von mpg123 mit M3U-Dateien umgehen. Die von mir verwendete Version 0.59r quittiert die Angabe einer M3U-Datei mit der Fehlermeldung: HTTP request failed. Ich verwende deshalb im Folgenden einen Stream aus der Liste. Sobald mpg123 auf dem Server installiert ist, kann es losgehen. Die Datei musiconhold.conf
wird editiert und durch eine neue Klasse erweitert. Anschliessend wird auf der Asterisk Konsole der MOH Dienst mit moh reload
neu geladen. Dies geht auch direkt von der UNIX Shell aus: asterisk -rx „moh reload“.
musiconhold.conf:
[swisspop]
mode=custom
directory=http://stream-2.ssatr.ch:80/rsp/mp3
application=/usr/local/bin/mpg123 -q -r 8000 -f 8192 -b 2048 --mono -s
Das Neuladen des MOH-Modules sollte nun zur Folge haben, dass von Asterisk mindestens ein mpg123 Prozess mit der angegebenen URL gestartet wird. Mit dem Kommando ps -x
Kommando kann dies leicht festgestellt werden. Sollte kein mpg123 Prozess in der Tabelle erscheinen, muss geprüft werden, ob mpg123 richtig installiert und im angegebenen Pfad (/usr/local/bin/) gespeichert ist. Wenn mpg123 läuft, kann im Folgenden das Dial()
Kommando erweitert werden:
Dial(SIP/pc1&SIP/pc2,60,m(swisspop))
Nach dem Neuladen des Dialplans sollte nun Musik von SwissPop zu hören sein, sobald die Nummer 032 517 81 80 gewählt wird. Um das Testen noch einfacher zu machen, können wir auch das MusicOnHold()
Kommando verwenden, dass nichts anderes tut, als die angegebene Wartemusik abzuspielen. Am einfachsten geht dies, wenn wir das Kommando mit einer internen Nummer verbinden und diese dann von einem Apparat anrufen, der direkt am Asterisk Server angeschlossen ist:
exten => 6200,1,Answer
exten => 6200,n,MusicOnHold(technik)
Und wenn es nicht geht? In meinem Beispiel gibt es viele Fehlerquellen. Insbesondere, da mit mpg123 auf einen externen Stream zugegriffen wird. Wenn die angegebene Adresse aus irgendeinem Grund nicht erreichbar ist, bleibt es stumm. Am besten ist es also, wir testen, ob mpg123 eine angegebene Adresse wiedergeben kann:
mpg123 --verbose -w test.wav http://stream-6.ssatr.ch:80/rsp/mp3
Damit wird eine Datei test.wav erzeugt, die anschliessend auf dem Desktop abgespielt werden kann. Wenn das nicht geht, muss die Netzwerkverbindung geprüft werden. Sollte der Stream aktiv sein, ohne dass etwas zu hören, könnte das Problem an der MOH-Konfiguration oder an den Eigenschaften des Streams liegen. In diesem Fall hilft oft ein Neuladen des MOH-Moduls nachdem der Verbose-Level auf einen hohen Wert gesetzt wird: set verbose 12
.
Ein Problem wird es immer geben: Der MP3-Stream könnte ausfallen, was wiederum dazu führt, dass keine Musik mehr zu hören. Ist Auch ein grösserer Zwischenspeicher löst dieses Problem nur sehr bedingt. Eine gute Lösung besteht darin, einen Stream vor der Verwendung zwischenzuspeichern. Der nächste Beitrag wird sich damit näher auseinandersetzen.
Mit dem Parameter -@ kann mpg123 auch mit M3U Playlists umgehen.
Vielen Dank für die Ergänzung, Stefan!
Hallo Benjamin,
mit grossem Interesse verfolge ich Deine Asterisk Seiten. Ich habe da einige Fragen:
1. wie kann ich ein Callername Script, welches ein Reverse Lookup auf search.ch macht implementieren? Arbeite mit Asterisk 1.8.15
2. Wie bringe ich mein System dazu Weiterleitungen per script zu akzeptieren?
3. mit der Registrierung zu meinem Sipcall provider hatte ich anfangs so meine Probleme. Wie muss das korrekt sein?
Meine Ausgangslage:
1. Meine Fritzbox ist direkt am Cablecom Modem angeschlossen.
2. Auf der Fritzbox habe ich mich dann die Registrierung zum Sip Call Provider gemacht. Soweit so gut.
3. Die Firtzbox habe ich dann mit einem interen User 620 PW XXXX versehen.
4. Damit die Registrierung vom Asterisk Server zur Fritzbox geht habe ich in
die users.conf folgendes gesetzt:
[620]
type=peer
host=192.168.X.X
username=620
fromuser=620
secret=XXXX
hassip=yes
registersip=yes
trunkstyle=voip
fromdomain=fritz.box
canreinvite=no
nat=yes
disallow=all
allow=ulaw
allow=alaw
allow=gsm
context=incoming
So funktioniert es jedenfalls. Es funktioniert be imir ohne die Registrierung in der sip.conf erfolgreich.
Danke Für Deinen Typ?
Gruss
Andy.