Differenze tra le versioni di "Riproduzione e contemporanea registrazione dell'audio di radio WEB mediante il Componente gb.media"

Da Gambas-it.org - Wikipedia.
Riga 2: Riga 2:
  
 
===Uso del plugin "uridecodebin" di GStreamer per decodificare l'audio in entrata===  
 
===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.
+
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 pl As MediaPipeline
 
      
 
      
 
      
 
      
  '''Public''' Sub ToggleButton1_Click()
+
  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
 +
  Dim temporaneo As String
 
   Dim tm As Date
 
   Dim tm As Date
   
+
 
   If ToggleButton1.Value Then
 
   If ToggleButton1.Value Then
     pl = New MediaPipeline
+
     temporaneo = Temp
 +
 +
  pl = New MediaPipeline
 
          
 
          
 
     src = New MediaControl(pl, "uridecodebin")
 
     src = New MediaControl(pl, "uridecodebin")
Riga 64: Riga 67:
 
   Endif
 
   Endif
 
      
 
      
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Close()
+
  Public Sub Form_Close()
 
   
 
   
 
   ToggleButton1.Value = False
 
   ToggleButton1.Value = False
Riga 74: Riga 77:
 
   Copy "/tmp/primoaudio.ogg" To "/tmp/audiofinale.ogg"
 
   Copy "/tmp/primoaudio.ogg" To "/tmp/audiofinale.ogg"
 
   
 
   
  '''End'''
+
  End
  
  
Riga 82: Riga 85:
 
   
 
   
 
   
 
   
  '''Public''' Sub ToggleButton1_Click()
+
  Public Sub ToggleButton1_Click()
 
    
 
    
 
   Dim src, tee, que, dcd, dcd2 As MediaControl
 
   Dim src, tee, que, dcd, dcd2 As MediaControl
Riga 144: Riga 147:
 
   Endif
 
   Endif
 
      
 
      
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Close()
+
  Public Sub Form_Close()
 
   
 
   
 
   ToggleButton1.Value = False
 
   ToggleButton1.Value = False
Riga 154: Riga 157:
 
   Copy "/tmp/primoaudio.ogg" To "/tmp/audiofinale.ogg"
 
   Copy "/tmp/primoaudio.ogg" To "/tmp/audiofinale.ogg"
 
   
 
   
  '''End'''
+
  End
  
 
==Ascoltare e contemporaneamente riprodurre soltanto alcune parti a scelta dell'audio trasmesso da una radio web==
 
==Ascoltare e contemporaneamente riprodurre soltanto alcune parti a scelta dell'audio trasmesso da una radio web==
Riga 167: Riga 170:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
      
 
      
 
   ToggleButton1.Text = "Avvia ascolto della radio"
 
   ToggleButton1.Text = "Avvia ascolto della radio"
Riga 173: Riga 176:
 
   Button2.Enabled = False
 
   Button2.Enabled = False
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub ToggleButton1_Click()
+
  Public Sub ToggleButton1_Click()
 
      
 
      
 
   If ToggleButton1.Value Then
 
   If ToggleButton1.Value Then
Riga 191: Riga 194:
 
   Endif
 
   Endif
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
      
 
      
 
   Audio()
 
   Audio()
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Private''' Procedure Audio()
+
  Private Procedure Audio()
 
      
 
      
 
   Dim src, que As MediaControl
 
   Dim src, que As MediaControl
Riga 256: Riga 260:
 
   Until pl.State == Media.Ready
 
   Until pl.State == Media.Ready
 
    
 
    
  '''End'''
+
  End
 
      
 
      
 
      
 
      
  '''Public''' Sub Button2_Click()
+
  Public Sub Button2_Click()
 
    
 
    
 
   Move "/tmp/audio" & CStr(i) & ".ogg" To "/tmp/audiofinal" & CStr(i) & ".ogg"  <FONT Color=gray>' ''Qual è e dov'è il file audio salvato''</font>
 
   Move "/tmp/audio" & CStr(i) & ".ogg" To "/tmp/audiofinal" & CStr(i) & ".ogg"  <FONT Color=gray>' ''Qual è e dov'è il file audio salvato''</font>
Riga 265: Riga 269:
 
   Button2.Enabled = False
 
   Button2.Enabled = False
 
    
 
    
  '''End'''
+
  End

Versione delle 04:14, 7 nov 2023

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
    
    
Public Sub ToggleButton1_Click()
 
 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
 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


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