Riproduzione dell'audio di radio WEB con il Componente gb.media
Le stazioni radio via WEB possono essere ascoltate in streaming anche utilizzando le risorse del Componente gb.media di Gambas.
Uso della Classe MediaPlayer
L'utilizzo della Classe MediaPlayer prevede l'uso del plug-in playbin.
Mostriamo un esempio pratico con un programma a riga di comando, nel quale basterà premere il tasto "Invio" per chiudere il programma.
Private bo As Boolean Public Sub Main() Dim mp As MediaPlayer With mp = New MediaPlayer .URL = "http://indirizzo/web/del/flusso/radio/live" .Play End With Repeat ' Mostra in console il tempo trascorso dall'avvio del processo dei dati audio ricevuti: Write "\rTempo trascorso: " & Str(Time(0, 0, 0, mp.Position * 1000)) Wait 0.01 Until bo = True mp.Stop mp.Close Quit End Public Sub Application_Read() bo = True End
Quest'altro esempio è pratico e in ambiente grafico.
Saranno mostrati anche i Metadati della radio web.
Private mp As MediaPlayer
Private Meta As New Collection
Private ss As New String[]
Public Sub ToggleButton1_Click()
If ToggleButton1.Value Then
TextArea1.Clear
With mp = New MediaPlayer As "MediaPlayer1"
.URL = "https://giosa.radioca.st/stream"
.Play
End With
Else
mp.Stop
mp.Close
Endif
End
Public Sub MediaPlayer1_Tag(tagList As MediaTagList)
For Each tag As String In tagList.Tags
If Not Meta.Exist(tag) Then
Meta[tag] = tagList[tag]
ss.Push(tag)
ss.Push(tagList[tag])
Else
ss[ss.Find(tag) + 1] = tagList[tag]
Endif
Next
TextArea1.Clear
For c As Short = 0 To ss.Max Step 2
TextArea1.Text &= ss[c] & ": " & ss[c + 1] & gb.NewLine
Next
End
Public Sub MediaPlayer1_Position()
Me.Title = Str(Time(0, 0, 0, mp.Pos * 1000))
End
Public Sub MediaPlayer1_End()
ToggleButton1.Value = False
End
In questo esempio mostreremo da un indirizzo web di una radio on-line i suoi Metadati e l'effetto grafico di un visualizzatore audio di GStreamer.
Per consentire l'uso dei plugin dei visualizzatori audio, è necessario avere installati nel sistema i seguenti pacchetti dei plugin:
- gstreamer1.0-plugins-bad
- gstreamer1.0-plugins-base
- gstreamer1.0-plugins-base-apps
- gstreamer1.0-plugins-good
- gstreamer1.0-plugins-ugly
Private mp As MediaPlayer
Private Meta As New Collection
Private ss As New String[]
Public Sub ToggleButton1_Click()
If ToggleButton1.Value Then
Dim plugVis As MediaControl
Dim tipoPlug As String[] = ["goom", "monoscope", "spacescope",
"spectrascope", "synaescope", "wavescope"]
TextArea1.Clear
With mp = New MediaPlayer As "MediaPlayer1"
plugVis = New MediaControl(mp, tipoPlug[5])
plugVis["style"] = 2
.Video.Output = New MediaControl(mp, "ximagesink")
.SetWindow(DrawingArea1)
.URL = "https://giosa.radioca.st/stream"
.Play
' La seguente riga deve stare "dopo" il Metodo ".Play()", altrimenti - in caso si arresti e poi si riavvii l'esecuzione del flusso audio - l'esecuzione si arresterà dopo qualche secondo:
.Video.Visualisation = plugVis
End With
Else
mp.Stop
mp.Close
Endif
End
Public Sub MediaPlayer1_Tag(tagList As MediaTagList)
For Each tag As String In tagList.Tags
If Not Meta.Exist(tag) Then
Meta[tag] = tagList[tag]
ss.Push(tag)
ss.Push(tagList[tag])
Else
ss[ss.Find(tag) + 1] = tagList[tag]
Endif
Next
TextArea1.Clear
For c As Short = 0 To ss.Max Step 2
TextArea1.Text &= ss[c] & ": " & ss[c + 1] & gb.NewLine
Next
End
Public Sub MediaPlayer1_Position()
Me.Title = Str(Time(0, 0, 0, mp.Pos * 1000))
End
Public Sub MediaPlayer1_End()
ToggleButton1.Value = False
End
Uso della Classe MediaPipeline
L'utilizzo della Classe MediaPipeline prevede l'uso del plug-in "playbin".
Mostriamo un esempio pratico, nel quale basterà premere il tasto "Invio" per chiudere il programma.
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline pl = New MediaPipeline(Null, "playbin") pl["uri"] = "https://hirschmilch.de:7001/psytrance.mp3" pl.Play() Repeat ' Mostra in console il tempo trascorso dall'avvio del processo dei dati audio ricevuti: Write "\rTempo trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until bo = True pl.Stop pl.Close Quit End Public Sub Application_Read() bo = True End
Uso delle Classi MediaPipeline e MediaControl
Si potrà fare uso anche delle Classi MediaPipeline e MediaControl.
L'esempio, che segue, prevede l'uso del plug-in "playbin". Basterà premere il tasto "Invio" per chiudere il programma.
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim src As MediaControl pl = New MediaPipeline src = New MediaControl(pl, "playbin") src["uri"] = "http://indirizzo/web/del/flusso/radio/live" pl.Play() Repeat ' Mostra in console il tempo trascorso dall'avvio del processo dei dati audio ricevuti: Write "\rTempo trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until bo = True pl.Stop pl.Close Quit End Public Sub Application_Read() bo = True End
Quest'altro esempio prevede l'uso dei plug-in "uridecodebin". Basterà premere il tasto "Invio" per chiudere il programma.
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim src, cnv, snk As MediaControl pl = New MediaPipeline src = New MediaControl(pl, "uridecodebin") src["uri"] = "http://94.130.113.214:8000/prog" cnv = New MediaControl(pl, "audioconvert") snk = New MediaControl(pl, "autoaudiosink") src.LinkLaterTo(cnv) cnv.LinkTo(snk) pl.Play() Repeat ' Mostra in console il tempo trascorso dall'avvio del processo dei dati audio ricevuti: Write "\rTempo trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until bo = True pl.Stop pl.Close Quit End Public Sub Application_Read() bo = True End
Quest'altro esempio prevede l'uso dei plug-in "souphttpsrc" e "decodebin".
Basterà premere il tasto "Invio" per chiudere il programma.
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim src, dcd, cnv, snk As MediaControl pl = New MediaPipeline src = New MediaControl(pl, "souphttpsrc") src["location"] = "http://198.15.94.34:8006/stream/1/" dcd = New MediaControl(pl, "decodebin") cnv = New MediaControl(pl, "audioconvert") snk = New MediaControl(pl, "autoaudiosink") src.LinkTo(dcd) dcd.LinkLaterTo(cnv) cnv.LinkTo(snk) pl.Play() Repeat ' Mostra in console il tempo trascorso dall'avvio del processo dei dati audio ricevuti: Write "\rTempo trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until bo = True pl.Stop pl.Close Quit End Public Sub Application_Read() bo = True End
Nel seguente esempio pratico in ambiente grafico saranno anche mostrati i Metadati della radio web:
Private pl As MediaPipeline
Private Meta As New Collection
Private ss As New String[]
Public Sub ToggleButton1_Click()
Dim src, dcb, con, snk As MediaControl
If ToggleButton1.Value Then
TextArea1.Clear
pl = New MediaPipeline As "PLine"
src = New MediaControl(pl, "souphttpsrc")
src["location"] = "https://giosa.radioca.st/stream"
dcb = New MediaControl(pl, "decodebin")
con = New MediaControl(pl, "audioconvert")
snk = New MediaControl(pl, "autoaudiosink")
src.LinkTo(dcb)
dcb.LinkLaterTo(con)
con.LinkTo(snk)
pl.Play
While pl.Position < 0.1
Wait 0.01
Wend
While pl.State == Media.Playing
Me.Title = Str(Time(0, 0, 0, pl.Pos * 1000))
Wait 0.1
Wend
pl.Close
Else
pl.Stop
pl.Close
Endif
End
Public Sub PLine_Tag(tagList As MediaTagList)
For Each tag As String In tagList.Tags
If Not Meta.Exist(tag) Then
Meta[tag] = tagList[tag]
ss.Push(tag)
ss.Push(tagList[tag])
Else
ss[ss.Find(tag) + 1] = tagList[tag]
Endif
Next
TextArea1.Clear
For c As Short = 0 To ss.Max Step 2
TextArea1.Text &= ss[c] & ": " & ss[c + 1] & gb.NewLine
Next
End
Uso delle Classi MediaPlayer e MediaControl e del plug-in jackaudiosink
L'uso delle Classi MediaPlayer e MediaControl e del plug-in jackaudiosink richiede che sia preliminarmente avviato il programma server Jack.
Mostriamo un esempio questa volta in ambiente grafico:
Private mp As MediaPlayer
Public Sub Form_Open()
Dim usc As MediaControl
With mp = New MediaPlayer
.URL = "http://indirizzo/web/del/flusso/radio/live"
End With
usc = New MediaControl(mp, "jackaudiosink")
mp.Audio.Output = usc
End
Public Sub ToggleButton1_Click()
If ToggleButton1.Value Then
mp.Play
While mp.State == Media.Playing
' Mostra nell'intestazione della finestra il tempo trascorso dall'avvio del processo dei dati audio ricevuti:
Me.Title = Format(Time(0, 0, 0, mp.Position * 1000), "hh:nn:ss.uuu")
Wait 0.01
Wend
Else
mp.Stop
mp.Close
Me.Title = "00:00:00.000"
Endif
End