Riproduzione e contemporanea registrazione dell'audio di radio WEB mediante il Componente gb.media
Per riprodurre e contemporaneamente registrare i dati audio di una radio web mediante le Classi "MediaPipeline" e "MediaControl" del Componente gb.media, è necessario dividere mediante il plugin "tee" di GStreamer il flusso di dati audio, sostanzialmente duplicandolo: un ramo servirà per l'uscita in riproduzione sonora, l'altro per l'uscita da salvare in un file audio.
Uso del plugin "uridecodebin" di GStreamer per decodificare l'audio in entrata
Nell'esempio in ambiente grafico, che segue, si utilizzerà il plugin uridecodebin per decodificare i dati audio ricevuti, che saranno riprodotti e anche salvati in un file di formato OGG.
Public Sub ToggleButton1_Click() Dim pl As MediaPipeline Dim src, tee, que As MediaControl Dim cnv1, snk1 As MediaControl Dim cnv2, ven, omu, snk2 As MediaControl Dim temporaneo As String Dim tm As Date If ToggleButton1.Value Then temporaneo = Temp pl = New MediaPipeline src = New MediaControl(pl, "uridecodebin") src["uri"] = "http://Indirizzo/web/del/flusso/dei/dati/audio/della/radio" tee = New MediaControl(pl, "tee") que = New MediaControl(pl, "queue") ' Per ascoltare l'audio della radio web: cnv1 = New MediaControl(pl, "audioconvert") snk1 = New MediaControl(pl, "autoaudiosink") ' Per salvare i dati del flusso audio della radio web in un file di formato OGG: cnv2 = New MediaControl(pl, "audioconvert") ven = New MediaControl(pl, "vorbisenc") omu = New MediaControl(pl, "oggmux") snk2 = New MediaControl(pl, "filesink") snk2["location"] = "/tmp/primoaudio.ogg" ' Cartella dove sarà salvato il file audio di formato OGG: ' Divide il flusso dei dati audio in due rami identici: src.LinkLaterTo(tee) ' 1° ramo dei dati audio (per la riproduzione sonora): tee.LinkTo(que) que.LinkTo(cnv1) cnv1.LinkTo(snk1) ' 2° ramo dei dati audio (per salvare i dati in un file OGG): tee.LinkTo(cnv2) cnv2.LinkTo(ven) ven.LinkTo(omu) omu.LinkTo(snk2) pl.Play() Repeat Wait 0.01 Until pl.State == Media.Playing tm = Now Repeat Me.Caption = Format(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)), "hh:nn:ss") Wait 0.01 Until pl.State == Media.Ready Else pl.Stop pl.Close Copy temporaneo To "/tmp/audio.ogg" Endif End
Uso dei plugin "souphttpsrc" e "decodebin" di GStreamer per decodificare l'audio in entrata
In quest'altro esempio si farà uso dei plugin "souphttpsrc " e "decodebin " di GStreamer.
Private pl As MediaPipeline Public Sub ToggleButton1_Click() Dim src, tee, que, dcd, dcd2 As MediaControl Dim cnv1, snk1 As MediaControl Dim cnv2, ven, omu, snk2 As MediaControl Dim tm As Date If ToggleButton1.Value Then pl = New MediaPipeline src = New MediaControl(pl, "souphttpsrc") src["location"] = "http://Indirizzo/web/del/flusso/dei/dati/audio/della/radio" tee = New MediaControl(pl, "tee") que = New MediaControl(pl, "queue") ' Per ascoltare l'audio della radio web: dcd = New MediaControl(pl, "decodebin") cnv1 = New MediaControl(pl, "audioconvert") snk1 = New MediaControl(pl, "autoaudiosink") ' Per salvare i dati del flusso audio della radio web in un file di formato OGG: dcd2 = New MediaControl(pl, "decodebin") cnv2 = New MediaControl(pl, "audioconvert") ven = New MediaControl(pl, "vorbisenc") omu = New MediaControl(pl, "oggmux") snk2 = New MediaControl(pl, "filesink") snk2["location"] = "/tmp/primoaudio.ogg" ' Cartella dove sarà salvato il file audio di formato OGG: ' Divide il flusso dei dati audio in due rami identici: src.LinkTo(tee) ' 1° ramo dei dati audio (per la riproduzione sonora): tee.LinkTo(que) que.LinkTo(dcd) dcd.LinkLaterTo(cnv1) cnv1.LinkTo(snk1) ' 2° ramo dei dati audio (per salvare i dati in un file OGG): tee.LinkTo(dcd2) dcd2.LinkLaterTo(cnv2) cnv2.LinkTo(ven) ven.LinkTo(omu) omu.LinkTo(snk2) pl.Play() Repeat Wait 0.01 Until pl.State == Media.Playing tm = Now Repeat Me.Caption = Format(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)), "hh:nn:ss") Wait 0.01 Until pl.State == Media.Ready Else pl.Stop pl.Close Endif End Public Sub Form_Close() ToggleButton1.Value = False ' Poiché, chiudendo il "Form", i dati salvati nel file audio vengono inspiegabilmente perduti, è necessario copiare il file audio creato in un altro nuovo file audio identico: Copy "/tmp/primoaudio.ogg" To "/tmp/audiofinale.ogg" End
Ascoltare e contemporaneamente riprodurre soltanto alcune parti a scelta dell'audio trasmesso da una radio web
Se, mentre si ascolta una radio web, si intende solo ogni tanto e a scelta registrare l'audio trasmesso, si può adottare il seguente codice (sarà usato il plugin "uridecodebin "):
Private pl As MediaPipeline Private tee As MediaControl Private cnv2 As MediaControl Private ven As MediaControl Private omu As MediaControl Private snk2 As MediaControl Private i As Integer = -1 Public Sub Form_Open() ToggleButton1.Text = "Avvia ascolto della radio" Button1.Enabled = False Button2.Enabled = False End Public Sub ToggleButton1_Click() If ToggleButton1.Value Then ToggleButton1.Text = "Chiudere il programma" Button1.Enabled = True Button1.Text = "Registra l'audio" Button2.Enabled = True Button2.Text = "Arresta la registrazione\ne salva in un file OGG" Audio() Else pl.Stop pl.Close Me.Close Endif End Public Sub Button1_Click() Audio() End Private Procedure Audio() Dim src, que As MediaControl Dim cnv1, snk1 As MediaControl Dim tm As Date pl = New MediaPipeline src = New MediaControl(pl, "uridecodebin") src["uri"] = "http://Indirizzo/web/del/flusso/dei/dati/audio/della/radio" tee = New MediaControl(pl, "tee") que = New MediaControl(pl, "queue") ' Per ascoltare il flusso di dati audio della radio web: cnv1 = New MediaControl(pl, "audioconvert") snk1 = New MediaControl(pl, "autoaudiosink") ' Per registrare i dati audio e salvare il relativo file audio in formato OGG: cnv2 = New MediaControl(pl, "audioconvert") ven = New MediaControl(pl, "vorbisenc") omu = New MediaControl(pl, "oggmux") ' Divide il flusso dei dati audio in due ramificazioni: src.LinkLaterTo(tee) ' 1° ramo dei dati audio (per l'ascolto): tee.LinkTo(que) que.LinkTo(cnv1) cnv1.LinkTo(snk1) ' 2° ramo dei dati audio (per registrare): tee.LinkTo(cnv2) cnv2.LinkTo(ven) ven.LinkTo(omu) snk2 = New MediaControl(pl, "filesink") Inc i snk2["location"] = "/tmp/audio" & CStr(i) & ".ogg" omu.LinkTo(snk2) If Exist("/tmp/audio0.ogg") Then Kill "/tmp/audio0.ogg" pl.Play() Button2.Enabled = True Repeat Wait 0.01 Until pl.State == Media.Playing tm = Now Repeat Me.Caption = Format(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)), "hh:nn:ss") Wait 0.01 Until pl.State == Media.Ready End Public Sub Button2_Click() Move "/tmp/audio" & CStr(i) & ".ogg" To "/tmp/audiofinal" & CStr(i) & ".ogg" ' Qual è e dov'è il file audio salvato Button1.Enabled = True Button2.Enabled = False End