Differenze tra le versioni di "Riproduzione e contemporanea registrazione dell'audio di radio WEB mediante il Componente gb.media"
(21 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
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. | 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 " | + | ===Uso del plugin "uridecodebin" di GStreamer per decodificare l'audio in entrata=== |
− | Nell'esempio in ambiente grafico, che segue, si utilizzerà il plugin | + | 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. |
− | + | Private pl As MediaPipeline | |
− | + | Private temporaneo As String | |
− | + | ||
− | + | ||
− | + | Public Sub ToggleButton1_Click() | |
+ | |||
Dim src, tee, que As MediaControl | Dim src, tee, que As MediaControl | ||
Dim cnv1, snk1 As MediaControl | Dim cnv1, snk1 As MediaControl | ||
Dim cnv2, ven, omu, snk2 As MediaControl | Dim cnv2, ven, omu, snk2 As MediaControl | ||
− | + | ||
− | |||
If ToggleButton1.Value Then | If ToggleButton1.Value Then | ||
− | pl = New MediaPipeline | + | temporaneo = Temp |
+ | |||
+ | pl = New MediaPipeline As "PLine" | ||
src = New MediaControl(pl, "uridecodebin") | src = New MediaControl(pl, "uridecodebin") | ||
− | src["uri"] = <FONT Color= | + | src["uri"] = <FONT Color=darkgreen>''"http://Indirizzo/web/del/flusso/dei/dati/audio/della/radio''</font>" |
tee = New MediaControl(pl, "tee") | tee = New MediaControl(pl, "tee") | ||
Riga 31: | Riga 33: | ||
omu = New MediaControl(pl, "oggmux") | omu = New MediaControl(pl, "oggmux") | ||
snk2 = New MediaControl(pl, "filesink") | snk2 = New MediaControl(pl, "filesink") | ||
− | snk2["location"] = | + | snk2["location"] = temporaneo |
<FONT Color=gray>' ''Divide il flusso dei dati audio in due rami identici:''</font> | <FONT Color=gray>' ''Divide il flusso dei dati audio in due rami identici:''</font> | ||
Riga 46: | Riga 48: | ||
ven.LinkTo(omu) | ven.LinkTo(omu) | ||
omu.LinkTo(snk2) | omu.LinkTo(snk2) | ||
− | + | ||
pl.Play() | pl.Play() | ||
− | + | ||
− | + | While pl.Position < 1 | |
Wait 0.01 | Wait 0.01 | ||
− | + | Wend | |
− | |||
− | |||
− | |||
Repeat | Repeat | ||
− | |||
Wait 0.01 | Wait 0.01 | ||
− | Until | + | Until Not ToggleButton1.Value |
Else | Else | ||
pl.Stop | pl.Stop | ||
pl.Close | pl.Close | ||
+ | If Exist("/tmp/audio.ogg") Then Kill "/tmp/audio.ogg" | ||
+ | Copy temporaneo To "/tmp/audio.ogg" | ||
Endif | Endif | ||
− | + | ||
− | + | End | |
− | + | Public Sub PLine_Position() | |
− | + | Me.Title = Time(0, 0, 0, pl.Position * 1000) | |
− | |||
− | + | End | |
− | ===Uso dei plugin "souphttpsrc" e " | + | ===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 " | + | In quest'altro esempio si farà uso dei plugin "''souphttpsrc'' " e "''decodebin'' " di GStreamer. |
− | + | Public Sub ToggleButton1_Click() | |
− | |||
− | |||
− | |||
− | Dim src, tee, que, dcd, | + | Dim pl As MediaPipeline |
− | + | Dim src, tee, que, dcd, cnv1, snk1 As MediaControl | |
− | Dim cnv2, | + | Dim dcd2, cnv2, vor, ogg, snk2 As MediaControl |
+ | Dim temporaneo As String | ||
Dim tm As Date | Dim tm As Date | ||
If ToggleButton1.Value Then | If ToggleButton1.Value Then | ||
+ | temporaneo = Temp | ||
+ | |||
pl = New MediaPipeline | pl = New MediaPipeline | ||
src = New MediaControl(pl, "souphttpsrc") | src = New MediaControl(pl, "souphttpsrc") | ||
− | src["location"] = | + | src["location"] = "https://uk2.streamingpulse.com/ssl/vcr2" |
tee = New MediaControl(pl, "tee") | tee = New MediaControl(pl, "tee") | ||
que = New MediaControl(pl, "queue") | que = New MediaControl(pl, "queue") | ||
− | + | ||
<FONT Color=gray>' ''Per ascoltare l'audio della radio web:''</font> | <FONT Color=gray>' ''Per ascoltare l'audio della radio web:''</font> | ||
dcd = New MediaControl(pl, "decodebin") | dcd = New MediaControl(pl, "decodebin") | ||
cnv1 = New MediaControl(pl, "audioconvert") | cnv1 = New MediaControl(pl, "audioconvert") | ||
snk1 = New MediaControl(pl, "autoaudiosink") | snk1 = New MediaControl(pl, "autoaudiosink") | ||
− | + | ||
<FONT Color=gray>' ''Per salvare i dati del flusso audio della radio web in un file di formato OGG:''</font> | <FONT Color=gray>' ''Per salvare i dati del flusso audio della radio web in un file di formato OGG:''</font> | ||
dcd2 = New MediaControl(pl, "decodebin") | dcd2 = New MediaControl(pl, "decodebin") | ||
cnv2 = New MediaControl(pl, "audioconvert") | cnv2 = New MediaControl(pl, "audioconvert") | ||
− | + | vor = New MediaControl(pl, "vorbisenc") | |
− | + | ogg = New MediaControl(pl, "oggmux") | |
snk2 = New MediaControl(pl, "filesink") | snk2 = New MediaControl(pl, "filesink") | ||
− | snk2["location"] = | + | snk2["location"] = temporaneo |
− | + | ||
<FONT Color=gray>' ''Divide il flusso dei dati audio in due rami identici:''</font> | <FONT Color=gray>' ''Divide il flusso dei dati audio in due rami identici:''</font> | ||
src.LinkTo(tee) | src.LinkTo(tee) | ||
− | + | ||
<FONT Color=gray>' ''1° ramo dei dati audio (per la riproduzione sonora):''</font> | <FONT Color=gray>' ''1° ramo dei dati audio (per la riproduzione sonora):''</font> | ||
tee.LinkTo(que) | tee.LinkTo(que) | ||
Riga 117: | Riga 116: | ||
dcd.LinkLaterTo(cnv1) | dcd.LinkLaterTo(cnv1) | ||
cnv1.LinkTo(snk1) | cnv1.LinkTo(snk1) | ||
− | + | ||
<FONT Color=gray>' ''2° ramo dei dati audio (per salvare i dati in un file OGG):''</font> | <FONT Color=gray>' ''2° ramo dei dati audio (per salvare i dati in un file OGG):''</font> | ||
tee.LinkTo(dcd2) | tee.LinkTo(dcd2) | ||
dcd2.LinkLaterTo(cnv2) | dcd2.LinkLaterTo(cnv2) | ||
− | cnv2.LinkTo( | + | cnv2.LinkTo(vor) |
− | + | vor.LinkTo(ogg) | |
− | + | ogg.LinkTo(snk2) | |
− | + | ||
pl.Play() | pl.Play() | ||
− | + | ||
+ | tm = Now | ||
+ | |||
Repeat | Repeat | ||
− | Wait 0. | + | Me.Title = Str(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond))) |
− | Until pl. | + | Wait 0.1 |
+ | Until Not ToggleButton1.Value | ||
+ | Else | ||
+ | pl.Stop | ||
+ | pl.Close | ||
+ | If Exist("/tmp/audio.ogg") Then Kill "/tmp/audio.ogg" | ||
+ | Copy temporaneo To "/tmp/audio.ogg" | ||
+ | Endif | ||
+ | |||
+ | 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 temporaneo As String | ||
+ | Private i As Integer = -1 | ||
+ | |||
+ | |||
+ | Public Sub Form_Open() | ||
− | + | ToggleButton1.Text = "Avvia ascolto della radio" | |
+ | ToggleButton2.Text = "Registra l'audio" | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub ToggleButton1_Click() | ||
− | + | If ToggleButton1.Value Then | |
− | + | temporaneo = Temp | |
− | + | ToggleButton1.Text = "Chiudere il programma" | |
− | + | Audio() | |
Else | Else | ||
pl.Stop | pl.Stop | ||
pl.Close | pl.Close | ||
+ | Me.Close | ||
Endif | Endif | ||
− | |||
− | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub ToggleButton2_Click() | ||
+ | |||
+ | If ToggleButton2.Value Then | ||
+ | ToggleButton2.Text = "Arresta la registrazione\ne salva in un file OGG" | ||
+ | Audio() | ||
+ | Else | ||
+ | If Exist("/tmp/audio" & CStr(i) & ".ogg") Then Kill "/tmp/audio" & CStr(i) & ".ogg" | ||
+ | Copy temporaneo To "/tmp/audio" & CStr(i) & ".ogg" | ||
+ | ToggleButton2.Text = "Registra l'audio" | ||
+ | Endif | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Private Procedure Audio() | ||
+ | |||
+ | Dim src, tee, que As MediaControl | ||
+ | Dim cnv1, snk1 As MediaControl | ||
+ | Dim cnv2, ven, omu, snk2 As MediaControl | ||
+ | Dim tm As Date | ||
+ | |||
+ | pl = New MediaPipeline | ||
+ | |||
+ | src = New MediaControl(pl, "uridecodebin") | ||
+ | src["uri"] = "https://mambo.newradio.it/stream" | ||
+ | |||
+ | tee = New MediaControl(pl, "tee") | ||
+ | que = New MediaControl(pl, "queue") | ||
+ | |||
+ | <FONT Color=gray>' ''Per ascoltare il flusso di dati audio della radio web:''</font> | ||
+ | cnv1 = New MediaControl(pl, "audioconvert") | ||
+ | snk1 = New MediaControl(pl, "autoaudiosink") | ||
+ | |||
+ | <FONT Color=gray>' ''Per registrare i dati audio e salvare il relativo file audio in formato OGG:''</font> | ||
+ | cnv2 = New MediaControl(pl, "audioconvert") | ||
+ | ven = New MediaControl(pl, "vorbisenc") | ||
+ | omu = New MediaControl(pl, "oggmux") | ||
+ | |||
+ | <FONT Color=gray>' ''Divide il flusso dei dati audio in due ramificazioni:''</font> | ||
+ | src.LinkLaterTo(tee) | ||
+ | |||
+ | <FONT Color=gray>' ''1° ramo dei dati audio (per l'ascolto):''</font> | ||
+ | tee.LinkTo(que) | ||
+ | que.LinkTo(cnv1) | ||
+ | cnv1.LinkTo(snk1) | ||
+ | |||
+ | <FONT Color=gray>' ''2° ramo dei dati audio (per registrare):''</font> | ||
+ | tee.LinkTo(cnv2) | ||
+ | cnv2.LinkTo(ven) | ||
+ | ven.LinkTo(omu) | ||
+ | snk2 = New MediaControl(pl, "filesink") | ||
+ | snk2["location"] = temporaneo | ||
+ | omu.LinkTo(snk2) | ||
+ | |||
+ | pl.Play() | ||
+ | |||
+ | Repeat | ||
+ | Wait 0.01 | ||
+ | Until pl.State == Media.Playing | ||
− | + | tm = Now | |
− | + | Repeat | |
− | + | Me.Title = Str(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond))) | |
+ | Wait 0.1 | ||
+ | Until pl.State == Media.Ready | ||
− | + | End |
Versione attuale delle 08:59, 17 gen 2024
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.
Private pl As MediaPipeline Private temporaneo As String Public Sub ToggleButton1_Click() Dim src, tee, que As MediaControl Dim cnv1, snk1 As MediaControl Dim cnv2, ven, omu, snk2 As MediaControl If ToggleButton1.Value Then temporaneo = Temp pl = New MediaPipeline As "PLine" 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"] = temporaneo ' 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() While pl.Position < 1 Wait 0.01 Wend Repeat Wait 0.01 Until Not ToggleButton1.Value Else pl.Stop pl.Close If Exist("/tmp/audio.ogg") Then Kill "/tmp/audio.ogg" Copy temporaneo To "/tmp/audio.ogg" Endif End Public Sub PLine_Position() Me.Title = Time(0, 0, 0, pl.Position * 1000) 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.
Public Sub ToggleButton1_Click() Dim pl As MediaPipeline Dim src, tee, que, dcd, cnv1, snk1 As MediaControl Dim dcd2, cnv2, vor, ogg, snk2 As MediaControl Dim temporaneo As String Dim tm As Date If ToggleButton1.Value Then temporaneo = Temp pl = New MediaPipeline src = New MediaControl(pl, "souphttpsrc") src["location"] = "https://uk2.streamingpulse.com/ssl/vcr2" 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") vor = New MediaControl(pl, "vorbisenc") ogg = New MediaControl(pl, "oggmux") snk2 = New MediaControl(pl, "filesink") snk2["location"] = temporaneo ' 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(vor) vor.LinkTo(ogg) ogg.LinkTo(snk2) pl.Play() tm = Now Repeat Me.Title = Str(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond))) Wait 0.1 Until Not ToggleButton1.Value Else pl.Stop pl.Close If Exist("/tmp/audio.ogg") Then Kill "/tmp/audio.ogg" Copy temporaneo To "/tmp/audio.ogg" Endif 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 temporaneo As String Private i As Integer = -1 Public Sub Form_Open() ToggleButton1.Text = "Avvia ascolto della radio" ToggleButton2.Text = "Registra l'audio" End Public Sub ToggleButton1_Click() If ToggleButton1.Value Then temporaneo = Temp ToggleButton1.Text = "Chiudere il programma" Audio() Else pl.Stop pl.Close Me.Close Endif End Public Sub ToggleButton2_Click() If ToggleButton2.Value Then ToggleButton2.Text = "Arresta la registrazione\ne salva in un file OGG" Audio() Else If Exist("/tmp/audio" & CStr(i) & ".ogg") Then Kill "/tmp/audio" & CStr(i) & ".ogg" Copy temporaneo To "/tmp/audio" & CStr(i) & ".ogg" ToggleButton2.Text = "Registra l'audio" Endif End Private Procedure Audio() Dim src, tee, que As MediaControl Dim cnv1, snk1 As MediaControl Dim cnv2, ven, omu, snk2 As MediaControl Dim tm As Date pl = New MediaPipeline src = New MediaControl(pl, "uridecodebin") src["uri"] = "https://mambo.newradio.it/stream" 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") snk2["location"] = temporaneo omu.LinkTo(snk2) pl.Play() Repeat Wait 0.01 Until pl.State == Media.Playing tm = Now Repeat Me.Title = Str(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond))) Wait 0.1 Until pl.State == Media.Ready End