Live Stream Radio per Anruf hören

boelkstoff

Neuer User
Mitglied seit
8 Mai 2007
Beiträge
130
Punkte für Reaktionen
0
Punkte
0
Hallo,

da zur zeit die WM ist, dachte ich mir, dass ich Euch mal meine Streaming Lösung presentiere.
Ziel ist es eine mp3 Stream (z.b. Deutschlandfunk oder irgendein Internetradio) durch Anruf einer speziellen Nummer zu hören.

So kann mann unterwegs immer "Radio hören"

1. madplay installieren
Code:
apt-get install madplay


2. eine Stream Datei erzeugen (stream-mdrinfo.sh)
Code:
#!/bin/bash
wget -O - http://62.146.66.19:80/22006mdr/live/3087mdr_info_live.mp3 \ | madplay -Q -o raw:- -R 8000 -a -12 --mono -


3. Datei kopieren
Erstellte Datei in das Verzeichniss /ets/asterisk kopieren

4. music on Hold anpassen (musiconhold.conf)

Code:
[mdrinfo]
mode=custom
application=/bin/sh /etc/asterisk/stream-mdrinfo.sh


5. Dialplan anpassen (extensions.conf)


Code:
exten => 7,1,SetMusicOnHold(mdrinfo) 
exten => 7,n,WaitMusicOnHold(900000);


6. Rufnummer 7 wählen und den Live Stream hören

Ich habe es z.B. verwendet, um den Livestream meines Heimatvereins (Lok Leipzig) unterwegs zu hören.
Da ich Base habe, kann ich kostenlos meine sipgate Rufnummer anhören und den Livestream hönre


Folgende Probleme habe ich noch:
Nach beenden des Gesprächs läuft der Stream weiter! Kennt da jemand eine Lösung, wie idieser Stream nach dem Auflegen beendet wird? Bspw. dass ich irgendwie die Prozessid von diesem Stream herrausfinde und nach dem Auflegen diesen prozess beende. Aber Achtung, es sollte auch möglich sein, dass mehrere personen anrufen und einen Stream hören. Also bitte nicht den Vorschlag machen, dass ALLE prozesse die madplay im Namen haben gekillt werden. Vielen Dank für Euere Vorschläge



Weitere Hinweise und/oder Verbesserungsvorschläge sind gerne erwünscht.
 
exten => 2005,1,Answer
exten => 2005,n,SetMusicOnHold(mdrinfo)
exten => 2005,n,MusicOnHold()
exten => 2005,n,Hangup


so wäre es korrekt, da sonst das Telefonat nach rund 2 Minuten beendet wird (die 2005 ist hier die interne Nummer.)
 
@DarkHawk

Wieso wird das Telefonat nach 2 min beeendet?
WaitMusicOnHold(900000); Spielt für ganze 900000Sekunden!
 
Hast du etwas raus bekommen wegen dem Stream abschalten? Immer auf die Konsole gehen und kill -9 machen ist auch nicht das wahre. Habe es versucht mit der Konferenz zu lösen, aber er macht für jeden Anrufer doch wieder einen neuen Stream auf. Mir würde es reichen wenn er die Konferenz immer offen lässt mit dem Stream und jeder anrufer dann dort dazu kommt. So bräuchte man nur 1 Stream egal für wieviele Anrufer.
 
Könnte evtl. nachfolgender Ansatz für die Ermittlung der Prozess-ID zum Stream abschalten genutzt werden:
  • stream-script als background Prozess starten
  • Prozess ID des stream-scripts ( kann via "echo $!" ermittelt werden ) zwischenspeichern
    -> in temporäre Datei, z.B. unter dem Names des aktuellen Channels ( ${CHANNEL} )
    -> oder via AGI-Script aufgerufen als Asterisk-Variable zurück geben ( echo "SET VARIABLE PROCESS_ID = $!" )
  • Systemaufruf zum killen der zwischengespeicherten Process-ID(s)
Off-topic:
- Was spräche dagegen den Stream evtl. direkt via Systemaufruf ( d.h. ganz ohne MOH ) zu starten ?
- Falls mehrere den gleichen Stream hören sollen, wäre es evtl. auch Sinnvoll das ganze über eine Named-Pipe laufen zu lassen
Code:
mkfifo /var/playthis
wget -O - [URL]http://62.146.66.19:80/22006mdr/live/3087mdr_info_live.mp3[/URL] > /var/playthis &
Alle madplays könnten dann aus der gleichen Named Pipe lesen ...
 
Wie geht das mit dem Systemaufruf, hast du da evt einen Link?
Kann ich denn Werte aus Asterisk in eine Datei schreiben lassen? Also zum Beispiel in einer Konferenz werden die Teilnehmer ja nummeriert, kann ich mir das + deren Telefonnummer in eine Datei schreiben lassen?
 
schau mal hier oder simples Beispiel unten.
Code:
exten => s,1,System(echo ${CHANNEL} > /tmp/save_current_channel )
 
Ok das habe ich verstanden.
Du schreibst weiter oben mit echo $! kann die Prozess ID ermittelt werden? Das geht bei mir nicht. :( Es wird ja erst der madplay Befehl asugeführt und er springt dann ja nicht zum nächsten Befehl. Hoffe habe mich gut ausgedrückt.
Wie sollte das mit dem Systemaufruf gehen? Die Asterisk kann doch nicht alles abspielen. Oder verstehe ich dich da falsch?

Code:
#!/bin/bash
wget -O - http://213.200.97.110:80/swr3live/livestream.mp3 \ | madplay -Q -o raw:- -R 8000 -a -12 --mono - &
echo $$
So habe ich es versucht. Leider wird madplay nicht in den Hintergrund geschickt.
 
Zuletzt bearbeitet:
$$ = Prozess-ID der aktuellen Shell / des aktuell Prozesses
$! = Prozess-ID des zuletzt in den Hintergrund geschickten Prozesses
Es wird ja erst der madplay Befehl asugeführt und er springt dann ja nicht zum nächsten Befehl.
Die gesamte Befehlszeile würde ja per "&" in den Hintergrund geschickt werden, so dass die Shell Abarbeitung weitergeht. Du müsstest in diesem Fall jedoch "echo $! > /tmp/meine_prozess_id" verwenden, da Du nicht die Prozess-ID der ausführenden Shell sondern des madplay Prozesses haben möchtest.

Wenn Du die Prozess-ID jedoch direkt in einer Asterisk Variable haben möchtest, würde das via AGI Script gehen.

Gruß
dynamic
 
Ok das habe ich auch verstanden, weiß ich wie ich das umsetze soweit. Nun fehlt mir aber noch wie ich das in den Asterisk einbau, denn sobald ich auflege führt er nichts mehr aus. er macht Hangup() und das wars. Befehle nachdem hangup() führt er nicht aus. :(
 
Mit dem Hangup() ist die Abarbeitung der exten für den jeweiligen Channel ja auch abgeschlossen.
Was genau willst Du denn nach Hangup() noch ausführen ?
 
Diesen kill befehl für das MadPlay wollte ich noch ausführen lassen. Sonst bringt mir der ja nichts.
 
Wenn in Deinem Context eine "h" Extension definiert ist, wird diese beim Auflegen ( Hangup ) angesprungen.
Darüber kannst Du steuern, was alles getan werden soll, sobald das Gespräch beendet wurde. Beispiel:
Code:
...
exten => h,1,System(kill -9 `cat /tmp/hier_ist_die_Proc_ID`)
exten => h,2,NoOP( Prozess wurde gekillt )
...
 
Danke! Das ist ja perfekt.
Die gilt dann aber für den ganzen Context oder?
Bei ISDN habe ich nämlich meine ganzen MSN in einem Context, dann müsste ich vorher im Dialplan in einen anderen Context springen oder?

Edit: Ich habe madplay 3 mal in der MOH.conf stehen, wenn er nur eins abspielen soll starte er alle drei und das was ich hören will nochmals. Ging das ohne Probleme bei euch?
 
Zuletzt bearbeitet:
Die gilt dann aber für den ganzen Context oder?
Ja
Bei ISDN habe ich nämlich meine ganzen MSN in einem Context, dann müsste ich vorher im Dialplan in einen anderen Context springen oder?
bzw. alternativ könnte man z.B. eine Variable setzen und in Abhängigkeit dieser Variable in der h Extension die Abarbeitung entsprechend steuern.
Ich habe madplay 3 mal in der MOH.conf stehen, wenn er nur eins abspielen soll starte er alle drei und das was ich hören will nochmals. Ging das ohne Probleme bei euch?
Keine Ahnung ... nutze selber kein MOH.
 
Ich weiß wieso es da steht, bei nem reload aktiviert er alle streams, wieso auch immer, er startet sie später nochmal.
Das mit dem mkfifo habe ich nicht hinbekommen. :( Habe dazu auch noch etwas geschrieben in einem anderen Thread.
Wenn du nicht soweit weg wohnen würdest hättest du dir schon nen Bier verdient. :)
 
Das virtuelle Bier ist angekommen - thanks ( die Unterstützung war ja auch nur virtuell - daher passt das scho' ;-) )
 
Kann mir jemand noch sagen für was das -12 hier ist:

madplay -Q -o raw:- -R 8000 -a -12 --mono -

in der man Page habe ich nichts dazu gefunden oder gehört das zu dem -a? Also macht die Töne leiser?
 
Richtig!
"-12" bedeutet hier nach dem "-a", dass die Lautstärke um 12 Dezibel verringert wird.
 
Zuletzt bearbeitet:
Moin

ich wollte mal fragen ob es mitlerweile eine gute lösung gibt.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.