Differenze tra le versioni di "Eseguire i file audio mediante la Classe ''MediaPipeline'' del componente gb.media"

Da Gambas-it.org - Wikipedia.
 
(24 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
La classe ''MediaPipeline'' del Componente ''gb.media'' consente di gestire i file audio previa concatenazione dei plugin e degli elementi forniti dalla risorsa ''GStreamer''.
 
La classe ''MediaPipeline'' del Componente ''gb.media'' consente di gestire i file audio previa concatenazione dei plugin e degli elementi forniti dalla risorsa ''GStreamer''.
<BR>In particolare la Classe ''MediaPipeline'' è uno speciale contenitore di Elementi ''GStreamer'' (ossia i ''MediaControl'' del Componente ''gb.media''), ai quali fornisce un clock globale per la sincronizzazione ed un bus per l'inoltro di messaggi provenienti dai thread dello streaming. <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
+
<BR>In particolare la Classe ''MediaPipeline'' è uno speciale contenitore di Elementi ''GStreamer'' (ossia i ''MediaControl'' del Componente ''gb.media''), ai quali fornisce un clock globale per la sincronizzazione ed un bus per l'inoltro di messaggi provenienti dai thread dello streaming. <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
  
Questa Classe implementa un funzionale media-player; pertanto è possibile anche mediante tale Classe eseguire in modo semplice un file audio impostando nei suoi argomenti il plugin ''Playbin''.
+
=Usare la Classe "MediaPipeline" con il decoder "playbin" di GStreamer=
 +
La Classe ''MediaPipeline'' implementa un funzionale media-player; pertanto è possibile anche mediante tale Classe eseguire in modo semplice un file audio impostando nei suoi argomenti il plugin ''Playbin''.
  
 
Mostriamo un esempio pratico in un'applicazione ''a riga di comando'':
 
Mostriamo un esempio pratico in un'applicazione ''a riga di comando'':
  '''Public''' Sub Main()
+
  Private bo As Boolean
 +
 +
 +
Public Sub Main()
 
    
 
    
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
  Dim s As String
 
 
    
 
    
   pl = New MediaPipeline(Null, "playbin")
+
   pl = New MediaPipeline(Null, "<FONT color=#B22222>playbin</font>") As "PLine"
   pl["uri"] = Media.URL("<FONT color=gray>''/percorso/del/file/audio''</font>")
+
   pl["uri"] = Media.URL("<FONT color=darkgreen>''/percorso/del/file/audio''</font>")
 
+
 
   pl.Play()
 
   pl.Play()
 
+
<FONT color=gray>' ''Utilizziamo la funzione "Input" per consentire l'esecuzione del file audio, evitando così un eccessivo aggravio di lavoro per la CPU. Inoltre, premendo il tasto "Invio" viene interrotta l'esecuzione.''</font>
+
  Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
   Input s
+
   Repeat
 
+
    Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
   pl.Stop
+
    Wait 0.01
 +
  Until bo
 +
 
   pl.Close
 
   pl.Close
 
+
  '''End'''
+
  Print "\n\e[0mEsecuzione terminata !"
 +
 +
  End
 +
 +
 +
Public Sub PLine_End()  <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font>
 +
 +
  bo = True
 +
 +
End
  
 
Il plugin "''playbin''" può anche essere inserito all'interno di un oggetto della Classe ''MediaControl'', la quale rappresenta un Elemento ordinario di ''GStreamer''.
 
Il plugin "''playbin''" può anche essere inserito all'interno di un oggetto della Classe ''MediaControl'', la quale rappresenta un Elemento ordinario di ''GStreamer''.
 
<BR>In quest'altro esempio mediante apposito ciclo sarà mostrato anche il tempo trascorso dall'esecuzione del file audio. Il ciclo si arresterà al termine dell'esecuzione del file.
 
<BR>In quest'altro esempio mediante apposito ciclo sarà mostrato anche il tempo trascorso dall'esecuzione del file audio. Il ciclo si arresterà al termine dell'esecuzione del file.
  '''Public''' Sub Main()
+
  Private bo As Boolean
 +
 +
 +
Public Sub Main()
 
    
 
    
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
 
   Dim mc As MediaControl
 
   Dim mc As MediaControl
  Dim tm As Date
+
 
+
   pl = New MediaPipeline As "PLine"
   pl = New MediaPipeline
 
 
    
 
    
   mc = New MediaControl(pl, "playbin")
+
   mc = New MediaControl(pl, "<FONT color=#B22222>playbin</font>")
   mc["uri"] = Media.URL("<FONT color=gray>''/percorso/del/file/audio''</font>")
+
   mc["uri"] = Media.URL("<FONT color=darkgreen>''/percorso/del/file/audio''</font>")
 
    
 
    
 
   pl.Play()
 
   pl.Play()
 
+
   Print "Durata: "; Str(Time(0, 0, 0, pl.Duration * 1000))
+
   Print "Durata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Repeat
 
   Repeat
     Write "\r\e[31m       " & Str(Time(0, 0, 0, pl.Position * 1000))
+
     Write "\r\e[0mTempo trascorso:  \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
 
     Wait 0.01
 
     Wait 0.01
   Until pl.Position >= pl.Duration
+
   Until bo
 
+
  pl.Stop
 
 
   pl.Close
 
   pl.Close
    
+
  '''End'''
+
   Print "\n\e[0mEsecuzione terminata !"
 +
 +
End
 +
 +
 +
  Public Sub PLine_End()  <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font>
 +
 +
  bo = True
 +
 +
End
  
=Utilizzare i plugin di GStreamer con le Classi ''MediaControl'' e ''MediaPipeline'' per eseguire i file audio=
+
=Usare la Classe "MediaPipeline" con il decoder "decodebin" di GStreamer=
E' possibile eseguire i file audio utilizzando specifici plugin di GStreamer <SUP>&#91;[[#Note|Nota 2]]&#93;</sup> con le Classi ''MediaControl'' e ''MediaPipeline''.
+
E' possibile eseguire i file audio utilizzando il plugin di "decodebin" oppure "decodebin3" di GStreamer.
  
Mostriamo di seguito alcuni esempi per l'esecuzione di file audio.
+
Mostriamo un esempio pratico a "riga di comando":
 
 
===Eseguire file audio di vari formati===
 
In questo caso si utlizzerà il plug-in "decodebin".
 
 
  Private bo As Boolean
 
  Private bo As Boolean
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
+
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
   Dim src,bin, con, ask As MediaControl
+
   Dim src, dcb, con, vol, snk As MediaControl
  Dim fileaudio As String
+
 
 
  fileaudio = "<FONT color=gray>''/percorso/del/file/audio''</font>"
 
 
 
 
   pl = New MediaPipeline As "PLine"
 
   pl = New MediaPipeline As "PLine"
 
+
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
   src["location"] = fileaudio
+
   src["location"] = "<FONT color=darkgreen>''/percorso/del/file/audio''</font>"
 
+
   bin = New MediaControl(pl, "decodebin")
+
   dcb = New MediaControl(pl, "<FONT color=#B22222>decodebin</font>")
 
   con = New MediaControl(pl, "audioconvert")
 
   con = New MediaControl(pl, "audioconvert")
   ask = New MediaControl(pl, "autoaudiosink")
+
   vol = New MediaControl(pl, "volume")        <FONT color=gray>' ''<1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100%''</font>
 
+
  vol["volume"] = 0.5
   src.LinkTo(bin)
+
  snk = New MediaControl(pl, "autoaudiosink")
   bin.LinkLaterTo(con)
+
   con.LinkTo(ask)
+
   src.LinkTo(dcb)
    
+
   dcb.LinkTo(con)
   pl.Play
+
   con.LinkTo(vol)
 
+
   vol.LinkTo(snk)
  Print "\rDurata del video: "; Str(Time(0, 0, 0, pl.Duration * 1000))
+
   Repeat
+
   pl.Play()
     Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
+
     Wait 0.001
+
   Repeat  
 +
     Write "\rTempo Trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000))
 +
     Wait 0.01
 
   Until bo
 
   Until bo
 
   
 
   
  pl.Stop
+
   pl.Close()
   pl.Close
 
 
   
 
   
  Print "\n\e[0mEsecuzione terminata !"
+
End
 
   
 
   
'''End'''
 
 
   
 
   
  '''Public''' Sub PLine_End() <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font>
+
  Public Sub PLine_End()
 
   
 
   
 
   bo = True
 
   bo = True
 
   
 
   
  '''End'''
+
  End
  
 +
=Utilizzare i plugin di GStreamer con le Classi ''MediaControl'' e ''MediaPipeline'' per eseguire file di specifici formati audio=
 +
E' possibile eseguire i file audio utilizzando specifici plugin di GStreamer <SUP>&#91;[[#Note|nota 2]]&#93;</sup> con le Classi ''MediaControl'' e ''MediaPipeline''.
 +
 +
Mostriamo di seguito alcuni esempi per l'esecuzione di file audio.
  
 
===Eseguire un file WAV===
 
===Eseguire un file WAV===
Riga 107: Riga 129:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
   Dim src, dcd, cnv, snk As MediaControl
+
   Dim src, dcd, cnv, vol, snk As MediaControl
 
   
 
   
 
   pl = New MediaPipeline As "PLine"
 
   pl = New MediaPipeline As "PLine"
 
   
 
   
   src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>")
+
   src = New MediaControl(pl, "filesrc")
   src["location"] = "<FONT color=gray>''/percorso/del/file.wav''</font>"   <FONT color=gray>' ''"location" è una proprietà del plugin "filesrc"''</font>
+
   src["location"] = "<FONT color=darkgreen>''/percorso/del/file.wav''</font>"
 
   
 
   
 
   dcd = New MediaControl(pl, "<FONT color=#B22222>wavparse</font>")
 
   dcd = New MediaControl(pl, "<FONT color=#B22222>wavparse</font>")
   cnv = New MediaControl(pl, "<FONT color=#B22222>audioconvert</font>")
+
   cnv = New MediaControl(pl, "audioconvert")
   snk = New MediaControl(pl, "<FONT color=#B22222>alsasink</font>")
+
  vol = New MediaControl(pl, "volume")        <FONT color=gray>' ''<1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100%''</font>
 +
  vol["volume"] = 0.5
 +
   snk = New MediaControl(pl, "alsasink")
 
   src.LinkTo(dcd)
 
   src.LinkTo(dcd)
 
   dcd.LinkTo(cnv)
 
   dcd.LinkTo(cnv)
   cnv.LinkTo(snk)
+
   cnv.LinkTo(vol)
 +
  vol.LinkTo(snk)
 
   
 
   
 
   pl.Play()
 
   pl.Play()
 
   
 
   
   Print "\rDurata del video: "; Str(Time(0, 0, 0, pl.Duration * 1000))
+
   Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Repeat
 
   Repeat
     Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
+
     Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
 
     Wait 0.01
 
     Wait 0.01
 
   Until bo
 
   Until bo
 
   
 
   
  pl.Stop()
 
 
   pl.Close()
 
   pl.Close()
 
   
 
   
  '''End'''
+
  Print "\n\e[0mEsecuzione terminata !"
 +
 +
  End
 +
 
   
 
   
  '''Public''' Sub PLine_End()  <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font>
+
  Public Sub PLine_End()  <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font>
 
   
 
   
 
   bo = True
 
   bo = True
 
   
 
   
  '''End'''
+
  End
 
 
 
In quest'altro esempio si potranno impostare i valori della frequenza di campionamento (rate) e dei canali, nonché modificare in "tempo reale" mediante tre ''Slider'' i valori della tonalità, del tempo di esecuzione e del volume d'uscita. Le due impostazioni relative alla tonalità e al tempo di esecuzione verranno effettuate con il plugin "pitch", considerando che:
 
In quest'altro esempio si potranno impostare i valori della frequenza di campionamento (rate) e dei canali, nonché modificare in "tempo reale" mediante tre ''Slider'' i valori della tonalità, del tempo di esecuzione e del volume d'uscita. Le due impostazioni relative alla tonalità e al tempo di esecuzione verranno effettuate con il plugin "pitch", considerando che:
 
* per impostare la tonalità si userà l'omonima proprietà "pitch": il valore di partenza predefinito è 1.0;
 
* per impostare la tonalità si userà l'omonima proprietà "pitch": il valore di partenza predefinito è 1.0;
* per impostare la velocità del tempo di esecuzione si userà la proprietà "tempo": il valore di partenza predefinito è 1.0.
+
* per impostare la velocità del tempo metronomico di esecuzione si userà la proprietà "tempo": il valore di partenza predefinito è 1.0;
 +
* per impostare il volume dell'audio si userà la proprietà "volume": il valore di partenza predefinito è 1.0.
 
  Private pl As MediaPipeline
 
  Private pl As MediaPipeline
 
  Private pit As MediaControl
 
  Private pit As MediaControl
Riga 155: Riga 182:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
    
 
    
 
   Dim src, par, cnv, res, enc, cnv2, snk As MediaControl
 
   Dim src, par, cnv, res, enc, cnv2, snk As MediaControl
Riga 163: Riga 190:
 
    
 
    
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
   src["location"] = "<FONT color=gray>''/percorso/del/file.wav''</font>"
+
   src["location"] = "<FONT color=darkgreen>''/percorso/del/file.wav''</font>"
   par = New MediaControl(pl, "wavparse")
+
   par = New MediaControl(pl, "<FONT color=#B22222>wavparse</font>")
 
   cnv = New MediaControl(pl, "audioconvert")
 
   cnv = New MediaControl(pl, "audioconvert")
 
   res = New MediaControl(pl, "audioresample")
 
   res = New MediaControl(pl, "audioresample")
Riga 201: Riga 228:
 
   End With
 
   End With
 
    
 
    
  '''End'''
+
  End
 +
 
    
 
    
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
   pl.Play()
 
   pl.Play()
 
    
 
    
   Print "\rDurata del video: "; Str(Time(0, 0, 0, pl.Duration * 1000))
+
   Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Repeat
 
   Repeat
     Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
+
     Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
 
     Wait 0.01
 
     Wait 0.01
 
   Until bo
 
   Until bo
Riga 215: Riga 243:
 
   pl.Close()
 
   pl.Close()
 
   
 
   
'''End'''
+
  Print "\n\e[0mEsecuzione terminata !"
 
   
 
   
  '''Public''' Sub Button2_Click()
+
  End
 +
 +
 +
Public Sub Button2_Click()
 
   
 
   
 
   pl.Stop()
 
   pl.Stop()
 
   pl.Close()
 
   pl.Close()
 +
<FONT Color=gray>' ''Consente di arrestare anche il ciclo del conteggio del tempo trascorso:''</font>
 +
  bo = True
 +
 +
End
 
   
 
   
'''End'''
 
 
   
 
   
  '''Public''' Sub Slider1_Change()
+
  Public Sub Slider1_Change()  <FONT Color=gray>' ''Modifica la Tonalità''</font>
 
   
 
   
 
   pitch = Slider1.Value / 100
 
   pitch = Slider1.Value / 100
Riga 230: Riga 264:
 
   ValueBox1.Value = pitch
 
   ValueBox1.Value = pitch
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub Slider2_Change()
+
  Public Sub Slider2_Change()  <FONT Color=gray>' ''Modifica il Tempo metronomico''</font>
 
   
 
   
 
   tempo = Slider2.Value / 100
 
   tempo = Slider2.Value / 100
Riga 238: Riga 273:
 
   ValueBox2.Value = tempo
 
   ValueBox2.Value = tempo
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Slider3_Change()
+
   
 +
Public Sub Slider3_Change()  <FONT Color=gray>' ''Modifica il Volume''</font>
 
   
 
   
 
   volume = Slider3.Value / 100
 
   volume = Slider3.Value / 100
Riga 246: Riga 282:
 
   ValueBox3.Value = volume
 
   ValueBox3.Value = volume
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub PLine_End()  <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font>
+
   
 +
Public Sub PLine_End()  <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font>
 
   
 
   
 
   bo = True
 
   bo = True
 
   
 
   
  '''End'''
+
  End
  
  
Riga 259: Riga 296:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
  Dim fileMP3 As String
 
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
   Dim src, map, mad, snk As MediaControl
+
   Dim src, map, mad, vol, snk As MediaControl
 
+
  fileMP3 ="<FONT color=gray>''/percorso/del/file.mp3''</font>"
 
 
 
 
   pl = New MediaPipeline As "PLine"
 
   pl = New MediaPipeline As "PLine"
 
    
 
    
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
   src["location"] = fileMP3
+
   src["location"] = "<FONT color=darkgreen>''/percorso/del/file.mp3''</font>"
 
    
 
    
   map = New MediaControl(pl, "mpegaudioparse")
+
   map = New MediaControl(pl, "<FONT color=#B22222>mpegaudioparse</font>")
   mad = New MediaControl(pl, "mpg123audiodec")
+
   mad = New MediaControl(pl, "<FONT color=#B22222>mpg123audiodec</font>")
   snk = New MediaControl(pl, "alsasink")
+
  vol = New MediaControl(pl, "volume")         <FONT color=gray>' ''<1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100%''</font>
 +
  vol["volume"] = 0.5
 +
   snk = New MediaControl(pl, "autoaudiosink")
 
   src.LinkTo(map)
 
   src.LinkTo(map)
 
   map.LinkTo(mad)
 
   map.LinkTo(mad)
   mad.LinkTo(snk)
+
   mad.LinkTo(vol)
 +
  vol.LinkTo(snk)
 
   
 
   
 
   pl.Play()
 
   pl.Play()
 
   
 
   
   Print "\rDurata del video: "; Str(Time(0, 0, 0, pl.Duration * 1000))
+
   Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Repeat
 
   Repeat
     Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
+
     Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
 
     Wait 0.01
 
     Wait 0.01
 
   Until bo
 
   Until bo
 
   
 
   
  pl.Stop
 
 
   pl.Close
 
   pl.Close
 
   
 
   
  '''End'''
+
  Print "\n\e[0mEsecuzione terminata !"
 +
 +
  End
 +
 
   
 
   
  '''Public''' Sub PLine_End()  <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font>
+
  Public Sub PLine_End()  <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font>
 
   
 
   
 
   bo = True
 
   bo = True
 
   
 
   
  '''End'''
+
  End
  
  
Qualora (anche per la eccessiva brevità del file MP3) non sia possibile usare la proprietà "''.Duration''" della Classe "''MediaPipeline''", ritornando essa solo il valore zero, per poter uscire alla fine dell'esecuzione del file audio MP3, bisognerà ricavare il valore della durata del file audio attraverso un complesso algoritmo. <SUP>&#091;[[#Note|Nota 3]]&#093;</sup>
+
===Eseguire un file OGG===
 
+
  Private bo as Boolean
Mostriamo di seguito il codice completo:
 
'''Public''' Sub Main()
 
 
 
  Dim pl As MediaPipeline
 
  Dim src, map, mad, snk As MediaControl
 
  Dim fileMP3 As String
 
  Dim dur, i As Integer
 
  Dim tm As Date
 
   
 
  fileMP3 = "<FONT color=gray>''/percorso/del/file.mp3''</font>"
 
 
 
  pl = New MediaPipeline
 
   
 
  src = New MediaControl(pl, "filesrc")
 
  src["location"] = fileMP3
 
   
 
  map = New MediaControl(pl, "<FONT color=#B22222>mpegaudioparse</font>")
 
  mad = New MediaControl(pl, "<FONT color=#B22222>mpg123audiodec</font>")
 
  snk = New MediaControl(pl, "alsasink")
 
  src.LinkTo(map)
 
  map.LinkTo(mad)
 
  mad.LinkTo(snk)
 
 
 
  pl.Play()
 
 
 
<FONT Color=gray>' ''Invoca la funzione per ottenere la durata del file audio MP3:''</font>
 
  dur = DurataMP3(fileMP3)
 
 
 
  tm = Now
 
 
 
  Repeat
 
    i = DateDiff(tm, Now, gb.Millisecond)
 
    Write "\rTempo: " & Time(0, 0, 0, i)
 
    Wait 0.001
 
  Until i >= dur
 
 
 
<FONT Color=gray>' ''Libera la memoria e va in chiusura:''</font>
 
    pl.Stop
 
    pl.Close
 
   
 
    Write "\nEsecuzione terminata !"
 
 
 
'''End'''
 
 
   
 
'''Private''' Function DurataMP3(mp3 As String) As Integer
 
 
 
  Dim s, ver_mp3, layer, prot, medio, circa As String
 
  Dim j, frequenza, num_frame, brVar, totBR, durata1, durata2, durata As Integer
 
  Dim vB, lB, brB, frB As Byte
 
  Dim initium, secundum, tertium, bitrate, cpf As Short
 
 
 
  Print "File audio mp3: '"; File.Name(mp3)
 
 
 
  s = File.Load(mp3)
 
  Print "\nDimensione: "; Len(s); " byte"
 
 
 
  initium = 1
 
 
 
  For j = initium To Len(s) - 1
 
    If (Asc(s, j) = 255) And (Asc(s, j + 1) > 241) And (Asc(s, j + 2) > 15) Then
 
      secundum = Asc(s, j + 1)
 
      tertium = Asc(s, j + 2)
 
<FONT Color=gray>' ''Individua 2° byte dell'header per estrarre le seguenti informazioni generali sul file mp3:''
 
' ''- vesione MPEG;''
 
' ''- layer.''
 
' ''I primi 3 bit più significativi (tutti posti a 1) appartengono con quelli del 1° byte all'identificazione dell'header.''</font>
 
 
 
<FONT Color=gray>' ''Viene individuata la versione del file mp3:''</font>
 
      vB = Asc(s, j + 1) And 24
 
      Select Case vB
 
        Case 0
 
          ver_mp3 = "2.5"
 
        Case 16
 
          ver_mp3 = "2"
 
        Case 24
 
          ver_mp3 = "1"
 
      End Select
 
     
 
<FONT Color=gray>' ''Viene individuato il "Layer" del file mp3:''</font>
 
      lB = Asc(s, j + 1) And 6
 
      Select Case lB
 
        Case 2
 
          layer = "III"
 
        Case 4
 
          layer = "II"
 
        Case 6
 
          layer = "I"
 
      End Select
 
     
 
      Print "Versione MPEG = "; ver_mp3, "Layer = "; layer
 
     
 
<FONT Color=gray>' ''Si analizza, quindi, il terzo byte per estrarre le seguenti informazioni generali sul file mp3:''
 
' ''- bitrate;''
 
' ''- frequenza di campionamento;''
 
' ''Tali informazioni sono condizionate dalla versione e dal layer del file MPEG.''</font>
 
      brB = Asc(s, j + 2) And 240
 
      bitrate = EstraeBitRate(ver_mp3, layer, brB)
 
     
 
      frB = Asc(s, j + 2) And 12
 
      frequenza = EstraeFrequenza(ver_mp3, frB)
 
     
 
      Exit
 
     
 
    Endif
 
  Next
 
 
 
  For j = 1 To Len(s) - 2
 
    If (Asc(s, j) = 255) And (Asc(s, j + 1) = secundum) Then Inc num_frame
 
    If (Asc(s, j) = 255) And (Asc(s, j + 1) = secundum) And (Asc(s, j + 2) <> tertium) Then
 
      Inc brVar
 
      brB = Asc(s, j + 2) And 240
 
      totBR += EstraeBitRate(ver_mp3, layer, brB)
 
    Endif
 
  Next
 
 
 
  <FONT Color=gray>' ''If brVar > num_frame * 0.1 Then''  ' '''Se interessa ottenere il bitrate variabile medio'''''
 
  '  ''Select Case layer''
 
  '    ''Case "I"''
 
  '      ''cpf = 384''
 
  '    ''Case "II"''
 
  '      ''cpf = 1152''
 
  '    ''Case "III"''
 
  '      ''If ver_mp3 = "1" Then''
 
  '        ''cpf = 1152''
 
  '      ''Else''
 
  '        ''cpf = 576''
 
  '      ''Endif''
 
  '  ''End Select''
 
  '  ''durata1 = Fix((num_frame * cpf / frequenza) * 1000)''
 
  '  ''bitrate = totBR / brVar''
 
  '  ''durata2 = Fix((Len(s) / bitrate) * 8)''
 
  '  ''durata = (durata1 + durata2) / 2''
 
  '  ''medio = "variabile medio "''
 
  '  ''circa = "circa "''
 
  ' ''Else''</font>
 
    durata = Fix((Len(s) / bitrate) * 8)
 
  <FONT Color=gray>' ''Endif''</font>
 
 
 
  Print "BitRate " & medio & "= "; bitrate; " kbps"
 
  Print "Frequenza = hz "; frequenza
 
  Print "Durata " & circa & "= "; Time(0, 0, 0, durata)
 
 
 
  Return durata
 
 
 
'''End'''
 
 
   
 
   
 
   
 
   
  '''Private''' Function EstraeBitRate(Vmpeg As String, layB As String, bitB As Byte) As Short
+
  Public Sub Main()
 
 
  Dim velCamp As Short
 
 
 
  If Vmpeg = "1" Then  <FONT Color=gray>' ''Nel caso di Mpeg vers. 1''</font>
 
    Select Case layB    <FONT Color=gray>' ''Verifica il Layer''</font>
 
      Case "I"
 
        Select Case bitB
 
          Case 16
 
            velCamp = 32
 
          Case 32
 
            velCamp = 64
 
          Case 48
 
            velCamp = 96
 
          Case 64
 
            velCamp = 128
 
          Case 80
 
            velCamp = 160
 
          Case 96
 
            velCamp = 192
 
          Case 112
 
            velCamp = 224
 
          Case 128
 
            velCamp = 256
 
          Case 144
 
            velCamp = 288
 
          Case 160
 
            velCamp = 320
 
          Case 176
 
            velCamp = 352
 
          Case 192
 
            velCamp = 384
 
          Case 208
 
            velCamp = 416
 
          Case 224
 
            velCamp = 448
 
        End Select
 
      Case "II"
 
        Select Case bitB
 
          Case 16
 
            velCamp = 32
 
          Case 32
 
            velCamp = 48
 
          Case 48
 
            velCamp = 56
 
          Case 64
 
            velCamp = 64
 
          Case 80
 
            velCamp = 80
 
          Case 96
 
            velCamp = 96
 
          Case 112
 
            velCamp = 112
 
          Case 128
 
            velCamp = 128
 
          Case 144
 
            velCamp = 160
 
          Case 160
 
            velCamp = 192
 
          Case 176
 
            velCamp = 224
 
          Case 192
 
            velCamp = 256
 
          Case 208
 
            velCamp = 320
 
          Case 224
 
            velCamp = 384
 
        End Select
 
      Case "III"
 
        Select Case bitB
 
          Case 16
 
            velCamp = 32
 
          Case 32
 
            velCamp = 40
 
          Case 48
 
            velCamp = 48
 
          Case 64
 
            velCamp = 56
 
          Case 80
 
            velCamp = 64
 
          Case 96
 
            velCamp = 80
 
          Case 112
 
            velCamp = 96
 
          Case 128
 
            velCamp = 112
 
          Case 144
 
            velCamp = 128
 
          Case 160
 
            velCamp = 160
 
          Case 176
 
            velCamp = 192
 
          Case 192
 
            velCamp = 224
 
          Case 208
 
            velCamp = 256
 
          Case 224
 
            velCamp = 320
 
        End Select
 
    End Select
 
   
 
  Else
 
   
 
    Select Case layB    <FONT Color=gray>' ''Verifica il Layer''</font>
 
      Case "I"
 
        Select Case bitB
 
          Case 16
 
            velCamp = 32
 
          Case 32
 
            velCamp = 48
 
          Case 48
 
            velCamp = 56
 
          Case 64
 
            velCamp = 64
 
          Case 80
 
            velCamp = 80
 
          Case 96
 
            velCamp = 96
 
          Case 112
 
            velCamp = 112
 
          Case 128
 
            velCamp = 128
 
          Case 144
 
            velCamp = 144
 
          Case 160
 
            velCamp = 160
 
          Case 176
 
            velCamp = 176
 
          Case 192
 
            velCamp = 192
 
          Case 208
 
            velCamp = 224
 
          Case 224
 
            velCamp = 256
 
        End Select
 
      Case "II" To "III"
 
        Select Case bitB
 
          Case 16
 
            velCamp = 8
 
          Case 32
 
            velCamp = 16
 
          Case 48
 
            velCamp = 24
 
          Case 64
 
            velCamp = 32
 
          Case 80
 
            velCamp = 40
 
          Case 96
 
            velCamp = 48
 
          Case 112
 
            velCamp = 56
 
          Case 128
 
            velCamp = 64
 
          Case 144
 
            velCamp = 80
 
          Case 160
 
            velCamp = 96
 
          Case 176
 
            velCamp = 112
 
          Case 192
 
            velCamp = 128
 
          Case 208
 
            velCamp = 144
 
          Case 224
 
            velCamp = 320
 
        End Select
 
    End Select
 
   
 
  Endif
 
 
 
  Return velCamp
 
 
 
'''End'''
 
 
   
 
   
 +
  Dim pl As MediaPipeline
 +
  Dim src, dem, vor, vol, snk As MediaControl
 
   
 
   
'''Private''' Function EstraeFrequenza(Vmpeg As String, fre As Byte) As Integer
+
   pl = New MediaPipeline As "PLine"
    
 
  Dim frq As Integer
 
 
 
    Select Case Vmpeg
 
      Case "1"         <FONT Color=gray>' ''Nel caso di Mpeg vers. 1''</font>
 
      Select Case fre
 
        Case 0
 
          frq = 44100
 
        Case 4
 
          frq = 48000
 
        Case 8
 
          frq = 32000
 
      End Select
 
    Case "2"          <FONT Color=gray>' ''Nel caso di Mpeg vers. 2''</font>
 
      Select Case fre
 
        Case 0
 
          frq = 22050
 
        Case 4
 
          frq = 24000
 
        Case 8
 
          frq = 16000
 
      End Select
 
    Case "2.5"        <FONT Color=gray>' ''Nel caso di Mpeg vers. 2.5''</font>
 
      Select Case fre
 
        Case 0
 
          frq = 11025
 
        Case 4
 
          frq = 12000
 
        Case 8
 
          frq = 8000
 
      End Select
 
  End Select
 
 
 
  Return frq
 
 
 
'''End'''
 
 
 
 
 
Un'alternativa è quella di usare l'Evento "''_End( )''" della Classe "''MediaPipeline''", inserendo nella sua routine l'assegnazione di un valore in una variabile per far uscire l'esecuzione del codice dal ciclo che consente di mostrare il tempo trascorso dall'inizio del processo audio del file mp3.
 
Private bo As Boolean
 
 
   
 
   
 
'''Public''' Sub Main()
 
 
 
  Dim pl As MediaPipeline
 
  Dim fileMP3 As String
 
  Dim src, map, mad, snk As MediaControl
 
  Dim tm As Date
 
 
 
  pl = New MediaPipeline As "PLine"
 
 
 
  fileMP3 ="<FONT color=gray>''/percorso/del/file.mp3''</font>"
 
 
 
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
   src["location"] = fileMP3
+
   src["location"] = "<FONT color=darkgreen>''/percorso/del/file.ogg''</font>"
 
 
  map = New MediaControl(pl, "mpegaudioparse")
 
  mad = New MediaControl(pl, "mpg123audiodec")
 
  snk = New MediaControl(pl, "alsasink")
 
  src.LinkTo(map)
 
  map.LinkTo(mad)
 
  mad.LinkTo(snk)
 
 
 
  pl.Play()
 
 
  Repeat
 
    Write "\r\e[0mTempo trascorso:  \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
 
    Wait 0.01
 
  Until bo
 
 
   
 
   
  pl.Stop
 
  pl.Close
 
 
 
'''End'''
 
 
'''Public''' Sub PLine_End()
 
 
 
  bo = True
 
 
 
'''End'''
 
 
 
===Eseguire un file OGG===
 
'''Public''' Sub Main()
 
 
 
  Dim pl As MediaPipeline
 
  Dim src, dem, vor, snk As MediaControl
 
 
 
  pl = New MediaPipeline As "PLine"
 
   
 
  src = New MediaControl(pl, "filesrc")
 
  src["location"] = "<FONT color=gray>''/percorso/del/file.ogg''</font>"
 
   
 
 
   dem = New MediaControl(pl, "<FONT color=#B22222>oggdemux</font>")
 
   dem = New MediaControl(pl, "<FONT color=#B22222>oggdemux</font>")
 
   vor = New MediaControl(pl, "<FONT color=#B22222>vorbisdec</font>")
 
   vor = New MediaControl(pl, "<FONT color=#B22222>vorbisdec</font>")
   snk = New MediaControl(pl, "alsasink")
+
  vol = New MediaControl(pl, "volume")        <FONT color=gray>' ''<1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100%''</font>
   
+
  vol["volume"] = 0.5
 +
   snk = New MediaControl(pl, "autoaudiosink")
 +
 
   src.LinkTo(dem)
 
   src.LinkTo(dem)
 
   dem.LinkLaterTo(vor)
 
   dem.LinkLaterTo(vor)
   vor.LinkTo(snk)
+
   vor.LinkTo(vol)
   
+
  vol.LinkTo(snk)
 +
 
   pl.Play()
 
   pl.Play()
       
+
 
   Print "\rDurata del video: "; Str(Time(0, 0, 0, pl.Duration * 1000))
+
   Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Repeat
 
   Repeat
     Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
+
     Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
 
     Wait 0.01
 
     Wait 0.01
 
   Until bo
 
   Until bo
 
   
 
   
  pl.Stop
 
 
   pl.Close
 
   pl.Close
 
    
 
    
 
   Write "\nEsecuzione terminata !"
 
   Write "\nEsecuzione terminata !"
 
      
 
      
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub PLine_End()
+
   
 +
Public Sub PLine_End()
 
   
 
   
 
   bo = True
 
   bo = True
 
   
 
   
  '''End'''
+
  End
  
  
Riga 752: Riga 389:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
+
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
 
   Dim src, dcd, snk As MediaControl
 
   Dim src, dcd, snk As MediaControl
 
+
 
   pl = New MediaPipeline As "PLine"
 
   pl = New MediaPipeline As "PLine"
   
+
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
   src["location"] = "<FONT color=gray>''/percorso/del/file.aac''</font>"
+
   src["location"] = "<FONT color=darkgreen>''/percorso/del/file.aac''</font>"
   
+
 
   dcd = New MediaControl(pl, "<FONT color=#B22222>faad</font>")
 
   dcd = New MediaControl(pl, "<FONT color=#B22222>faad</font>")
 
   snk = New MediaControl(pl, "alsasink")
 
   snk = New MediaControl(pl, "alsasink")
 
   src.LinkTo(dcd)
 
   src.LinkTo(dcd)
 
   dcd.LinkTo(snk)
 
   dcd.LinkTo(snk)
   
+
 
   pl.Play()
 
   pl.Play()
   
+
 
   Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Repeat
 
   Repeat
     Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
+
     Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
 
     Wait 0.01
 
     Wait 0.01
 
   Until bo
 
   Until bo
 
   
 
   
  pl.Stop
 
 
   pl.Close
 
   pl.Close
 
+
 
   Write "\nEsecuzione terminata !"
 
   Write "\nEsecuzione terminata !"
   
 
'''End'''
 
 
   
 
   
  '''Public''' Sub PLine_End()
+
  End
 +
 +
 +
Public Sub PLine_End()
 
    
 
    
 
   bo = True
 
   bo = True
 
    
 
    
  '''End'''
+
  End
  
  
Riga 793: Riga 430:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
+
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
 
   Dim src, fpa, fde, snk As MediaControl
 
   Dim src, fpa, fde, snk As MediaControl
 
+
 
   pl = New MediaPipeline As "PLine"
 
   pl = New MediaPipeline As "PLine"
   
+
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
   src["location"] = "<FONT color=gray>''/percorso/del/file.flac''</font>"   <FONT color=gray>' ''"location" è una proprietà del plugin "filesrc"''</font>
+
   src["location"] = "<FONT color=darkgreen>''/percorso/del/file.flac''</font>"
   
+
 
   fpa = New MediaControl(pl, "<FONT color=#B22222>flacparse</font>")
 
   fpa = New MediaControl(pl, "<FONT color=#B22222>flacparse</font>")
 
   fde = New MediaControl(pp, "<FONT color=#B22222>flacdec</font>")
 
   fde = New MediaControl(pp, "<FONT color=#B22222>flacdec</font>")
 
   snk = New MediaControl(pl, "alsasink")
 
   snk = New MediaControl(pl, "alsasink")
   
+
 
   src.LinkTo(fpa)
 
   src.LinkTo(fpa)
 
   fpa.LinkTo(fde)
 
   fpa.LinkTo(fde)
 
   fde.LinkTo(snk)
 
   fde.LinkTo(snk)
   
+
 
   pl.Play()
 
   pl.Play()
 
+
 
   Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Repeat
 
   Repeat
     Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
+
     Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
 
     Wait 0.01
 
     Wait 0.01
 
   Until bo
 
   Until bo
   
+
  pl.Stop
 
 
   pl.Close
 
   pl.Close
 
+
 
   Write "\nEsecuzione terminata !"
 
   Write "\nEsecuzione terminata !"
      
+
'''End'''
+
End
 +
 +
 +
Public Sub PLine_End()
 +
 
 +
  bo = True
 +
 
 +
End
 +
 
 +
 
 +
==Estrarre i Tag da un file audio==
 +
E' possibile estrarre da un file gli eventuali Metadati mediante l'Evento "_Tag()" della Classe ''MediaPipeline''.
 +
 
 +
Mostriamo un esempio che prevede l'estrazione dei Tag metadati da un file audio di formato MP3:
 +
Private pl As MediaPipeline
 +
Private Meta As New Collection
 +
Private ss As New String[]
 +
 +
 +
Public Sub ToggleButton1_Click()
 +
 +
  Dim src, map, mad, snk As MediaControl
 +
 +
  If ToggleButton1.Value Then
 +
     TextArea1.Clear
 +
    pl = New MediaPipeline As "PLine"
 +
    src = New MediaControl(pl, "filesrc")
 +
    src["location"] = "<FONT color=darkgreen>''/percorso/del/file/audio''</font>"
 +
    map = New MediaControl(pl, "mpegaudioparse")
 +
    mad = New MediaControl(pl, "mpg123audiodec")
 +
    snk = New MediaControl(pl, "autoaudiosink")
 +
 +
    src.LinkTo(map)
 +
    map.LinkTo(mad)
 +
    mad.LinkTo(snk)
 +
 +
    pl.Play
 +
 +
    While pl.Duration < 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
 +
 
 +
 
 +
===Estrarre i Tag da un file sito in una pagina web===
 +
Mostriamo un esempio pratico:
 +
Private pl As MediaPipeline
 +
Private Meta As New Collection
 +
Private ss As New String[]
 +
 +
 +
Public Sub ToggleButton1_Click()
 +
 +
  Dim src, map, mad, snk As MediaControl
 +
 +
  If ToggleButton1.Value Then
 +
    TextArea1.Clear
 +
    pl = New MediaPipeline As "PLine"
 +
    src = New MediaControl(pl, "souphttpsrc")
 +
    src["location"] = "https&#058;//samples-files.com/samples/Audio/mp3/sample-file-1.mp3"
 +
    map = New MediaControl(pl, "mpegaudioparse")
 +
    mad = New MediaControl(pl, "mpg123audiodec")
 +
    snk = New MediaControl(pl, "autoaudiosink")
 +
 +
    src.LinkTo(map)
 +
    map.LinkTo(mad)
 +
    mad.LinkTo(snk)
 +
 +
    pl.Play
 +
 +
    While pl.Duration < 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
 +
Se si tratta dell'inirizzo web di una radio om-line, allora useremo il decoder ''decodebin''.
 +
<BR>Esempio pratico:
 +
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&#058;//giosa.radioca.st/stream"
 +
    dcb = New MediaControl(pl, "<Font color=red>decodebin</font>")
 +
    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
 +
 
  
  '''Public''' Sub PLine_End()
+
==Mostrare i plug-in dei visualizzatori grafici di Gstreamer==
 +
Per consentire l'uso dei [https://gstreamer.freedesktop.org/documentation/additional/splitup.html?gi-language=c plugin] dei visualizzatori audio, è necessario avere installati nel sistema i seguenti pacchetti dei [https://gstreamer.freedesktop.org/documentation/additional/splitup.html?gi-language=c plugin]:
 +
<BR> - gstreamer1.0-plugins-bad
 +
<BR> - gstreamer1.0-plugins-base
 +
<BR> - gstreamer1.0-plugins-base-apps
 +
<BR> - gstreamer1.0-plugins-good
 +
<BR> - gstreamer1.0-plugins-ugly
 +
Private pl As MediaPipeline
 +
 +
 +
  Public Sub ToggleButton1_Click()
 
    
 
    
   bo = True
+
   If ToggleButton1.Value Then
 +
    Dim DrawingArea1 As DrawingArea
 +
    Dim src, dcb, tee, que1, que2 As MediaControl
 +
    Dim vcon, plug, vsnk As MediaControl
 +
    Dim acon, asnk As MediaControl
 +
    Dim tipoPlug As String[] = ["goom", "goom2k1", "monoscope", "spacescope",
 +
                                "spectrascope", "synaescope", "wavescope"]
 +
 +
    With DrawingArea1 = New DrawingArea(Me)
 +
      .X = 10
 +
      .Y = 10
 +
      .W = 300
 +
      .H = 300
 +
      .Background = Color.Black
 +
    End With
 +
 +
    pl = New MediaPipeline As "PLine"
 +
 +
    src = New MediaControl(pl, "filesrc")
 +
    src["location"] = "<FONT color=darkgreen>''/percorso/del/file/audio''</font>"
 +
    dcb = New MediaControl(pl, "decodebin")
 +
    tee = New MediaControl(pl, "tee")
 +
    que1 = New MediaControl(pl, "queue")
 +
    vcon = New MediaControl(pl, "audioconvert")
 +
    plug = New MediaControl(pl, tipoPlug[6])
 +
    plug["style"] = 2    <SUP>&#91;[[#Note|nota 3]]&#93;</sup>
 +
    vsnk = New MediaControl(pl, "ximagesink")
 +
    que2 = New MediaControl(pl, "queue")
 +
    acon = New MediaControl(pl, "audioconvert")
 +
    asnk = New MediaControl(pl, "autoaudiosink")
 +
 +
    src.LinkTo(dcb)
 +
    dcb.LinkLaterTo(tee)
 +
<FONT Color=gray>' '''''Parte video:'''''</font>
 +
    tee.LinkTo(que1)
 +
    que1.LinkTo(vcon)
 +
    vcon.LinkTo(plug)
 +
    plug.LinkTo(vsnk)
 +
<FONT Color=gray>' '''''Parte audio:'''''</font>
 +
    tee.LinkTo(que2)
 +
    que2.LinkTo(acon)
 +
    acon.LinkTo(asnk)
 +
<FONT Color=gray>' ''Si dice al MediaControl di mostrare il proprio output (gli effetti video) in uno specifico controllo GUI, solitamente una DrawingArea:''</font>
 +
    vsnk.SetWindow(DrawingArea1)
 +
 +
    pl.Play()
 +
    While (pl.Duration < 0.1) Or (pl.Pos < 0.1)
 +
      Wait 0.01
 +
    Wend
 +
 +
    Wait pl.Duration
 +
 +
  Else
 +
    pl.Stop
 +
    pl.Close
 +
  Endif
 +
   
 +
End
 +
 +
 +
Public Sub PLine_Position()
 
    
 
    
  '''End'''
+
  Me.Title = Str(Time(0, 0, 0, pl.Pos * 1000))
 +
 +
End
 +
 +
 +
Public Sub PLine_End()
 +
 +
  pl.Close
 +
  ToggleButton1.Value = False
 +
 +
  End
  
  
Riga 842: Riga 752:
  
 
Mostriamo un semplice esempio di esecuzione di un file wav in un'applicazione ''a riga di comando'':
 
Mostriamo un semplice esempio di esecuzione di un file wav in un'applicazione ''a riga di comando'':
  '''Public''' Sub Main()
+
  Private bo As Boolean
 +
 +
 +
Public Sub Main()
 
    
 
    
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
 
   Dim src, prs, cnv, snk As MediaControl
 
   Dim src, prs, cnv, snk As MediaControl
 
   
 
   
   pl = New MediaPipeline  
+
   pl = New MediaPipeline As "PLine"
 
    
 
    
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
   src["location"] = "<FONT color=gray>''/percorso/del/file.wav''</font>"     <FONT color=gray>' ''"location" è una proprietà del plugin "filesrc"''</font>
+
   src["location"] = "<FONT color=darkgreen>''/percorso/del/file.wav''</font>"
 
   prs = New MediaControl(pl, "wavparse")
 
   prs = New MediaControl(pl, "wavparse")
 
   cnv = New MediaControl(pl, "audioconvert")
 
   cnv = New MediaControl(pl, "audioconvert")
Riga 860: Riga 773:
 
    
 
    
 
   pl.Play()
 
   pl.Play()
 +
 +
  Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 +
  Repeat
 +
    Write "\r\e[0mTempo trascorso:  \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
 +
    Wait 0.01
 +
  Until bo
 +
 +
  pl.Close()
 +
 +
  Write "\nEsecuzione terminata !"
 +
 +
End
 +
 +
 +
Public Sub PLine_End()
 
    
 
    
   Print "\nDurata: " & Time(0, 0, 0, pl.Duration * 1000)
+
   bo = True
  Wait pl.Duration
 
 
    
 
    
  pl.Stop()
+
  End
  pl.Close()
 
 
 
  '''End'''
 
  
  
Riga 878: Riga 802:
 
[2] Per avere contezza di quali siano i plugin ed i filtri da utilizzare, è opportuno vedere sulla rete la [https://gstreamer.freedesktop.org/documentation/ documentazione di GStreamer] e gli eventuali esempi pratici.
 
[2] Per avere contezza di quali siano i plugin ed i filtri da utilizzare, è opportuno vedere sulla rete la [https://gstreamer.freedesktop.org/documentation/ documentazione di GStreamer] e gli eventuali esempi pratici.
  
[3] Si segnalano come riferimento le seguenti pagine della Wiki:
+
[3] Sullo stile dell'elemento "wavescope" vedere: [https://gstreamer.freedesktop.org/documentation/audiovisualizers/wavescope.html?gi-language=c#GstWaveScopeStyle Stile wavescope]
* http://www.gambas-it.org/wiki/index.php?title=La_struttura_di_un_file_MPEG
 
* http://www.gambas-it.org/wiki/index.php?title=Calcolare_la_durata_di_un_file_MP3
 

Versione attuale delle 18:09, 11 gen 2024

La classe MediaPipeline del Componente gb.media consente di gestire i file audio previa concatenazione dei plugin e degli elementi forniti dalla risorsa GStreamer.
In particolare la Classe MediaPipeline è uno speciale contenitore di Elementi GStreamer (ossia i MediaControl del Componente gb.media), ai quali fornisce un clock globale per la sincronizzazione ed un bus per l'inoltro di messaggi provenienti dai thread dello streaming. [nota 1]

Usare la Classe "MediaPipeline" con il decoder "playbin" di GStreamer

La Classe MediaPipeline implementa un funzionale media-player; pertanto è possibile anche mediante tale Classe eseguire in modo semplice un file audio impostando nei suoi argomenti il plugin Playbin.

Mostriamo un esempio pratico in un'applicazione a riga di comando:

Private bo As Boolean


Public Sub Main()
 
 Dim pl As MediaPipeline
 
 pl = New MediaPipeline(Null, "playbin") As "PLine"
 pl["uri"] = Media.URL("/percorso/del/file/audio")

 pl.Play()

 Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 Repeat
   Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo

 pl.Close

 Print "\n\e[0mEsecuzione terminata !"

End


Public Sub PLine_End()  ' Questo Evento viene sollevato, quando l'operazione è terminata

 bo = True

End

Il plugin "playbin" può anche essere inserito all'interno di un oggetto della Classe MediaControl, la quale rappresenta un Elemento ordinario di GStreamer.
In quest'altro esempio mediante apposito ciclo sarà mostrato anche il tempo trascorso dall'esecuzione del file audio. Il ciclo si arresterà al termine dell'esecuzione del file.

Private bo As Boolean


Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim mc As MediaControl

 pl = New MediaPipeline As "PLine"
  
 mc = New MediaControl(pl, "playbin")
 mc["uri"] = Media.URL("/percorso/del/file/audio")
  
 pl.Play()

 Print "Durata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 Repeat
   Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo

 pl.Close

 Print "\n\e[0mEsecuzione terminata !"

End


Public Sub PLine_End()  ' Questo Evento viene sollevato, quando l'operazione è terminata

 bo = True

End

Usare la Classe "MediaPipeline" con il decoder "decodebin" di GStreamer

E' possibile eseguire i file audio utilizzando il plugin di "decodebin" oppure "decodebin3" di GStreamer.

Mostriamo un esempio pratico a "riga di comando":

Private bo As Boolean


Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, dcb, con, vol, snk As MediaControl

 pl = New MediaPipeline As "PLine"

 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file/audio"

 dcb = New MediaControl(pl, "decodebin")
 con = New MediaControl(pl, "audioconvert")
 vol = New MediaControl(pl, "volume")         ' <1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100%
 vol["volume"] = 0.5
 snk = New MediaControl(pl, "autoaudiosink")

 src.LinkTo(dcb)
 dcb.LinkTo(con)
 con.LinkTo(vol)
 vol.LinkTo(snk)

 pl.Play()

 Repeat 
   Write "\rTempo Trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo

 pl.Close()

End


Public Sub PLine_End()

 bo = True

End

Utilizzare i plugin di GStreamer con le Classi MediaControl e MediaPipeline per eseguire file di specifici formati audio

E' possibile eseguire i file audio utilizzando specifici plugin di GStreamer [nota 2] con le Classi MediaControl e MediaPipeline.

Mostriamo di seguito alcuni esempi per l'esecuzione di file audio.

Eseguire un file WAV

In questo caso si utilizzeranno i plug-in specifici per eseguire un file di formato WAV.

Private bo As Boolean


Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, dcd, cnv, vol, snk As MediaControl

 pl = New MediaPipeline As "PLine"

 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file.wav"

 dcd = New MediaControl(pl, "wavparse")
 cnv = New MediaControl(pl, "audioconvert")
 vol = New MediaControl(pl, "volume")         ' <1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100%
 vol["volume"] = 0.5
 snk = New MediaControl(pl, "alsasink")
 src.LinkTo(dcd)
 dcd.LinkTo(cnv)
 cnv.LinkTo(vol)
 vol.LinkTo(snk)

 pl.Play()

 Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 Repeat
   Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo

 pl.Close()

 Print "\n\e[0mEsecuzione terminata !"

End


Public Sub PLine_End()  ' Questo Evento viene sollevato, quando l'operazione è terminata

 bo = True

End

In quest'altro esempio si potranno impostare i valori della frequenza di campionamento (rate) e dei canali, nonché modificare in "tempo reale" mediante tre Slider i valori della tonalità, del tempo di esecuzione e del volume d'uscita. Le due impostazioni relative alla tonalità e al tempo di esecuzione verranno effettuate con il plugin "pitch", considerando che:

  • per impostare la tonalità si userà l'omonima proprietà "pitch": il valore di partenza predefinito è 1.0;
  • per impostare la velocità del tempo metronomico di esecuzione si userà la proprietà "tempo": il valore di partenza predefinito è 1.0;
  • per impostare il volume dell'audio si userà la proprietà "volume": il valore di partenza predefinito è 1.0.
Private pl As MediaPipeline
Private pit As MediaControl
Private vol As MediaControl
Private pitch As Float = 1.00
Private tempo As Float = 1.00
Private volume As Float = 1.00
Private bo As Boolean


Public Sub Form_Open()
 
 Dim src, par, cnv, res, enc, cnv2, snk As MediaControl
 Dim flt As MediaFilter
 
 pl = New MediaPipeline As "PLine"
 
 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file.wav"
 par = New MediaControl(pl, "wavparse")
 cnv = New MediaControl(pl, "audioconvert")
 res = New MediaControl(pl, "audioresample")
 flt = New MediaFilter(pl, "audio/x-raw,rate=44100,channels=2")
 pit = New MediaControl(pl, "pitch")
 vol = New MediaControl(pl, "volume")
 cnv2 = New MediaControl(pl, "audioconvert")
 snk = New MediaControl(pl, "alsasink")
  
 src.LinkTo(par)
 par.LinkTo(cnv)
 cnv.LinkTo(res)
 res.LinkTo(flt)
 flt.LinkTo(pit)
 pit.LinkTo(cnv2)
 cnv2.LinkTo(vol)
 vol.LinkTo(snk)
 
' Imposta alcuni valori dei due "Slider":
 With Slider1
   .MinValue = 0
   .MaxValue = 1000
   .Value = 100
 End With
 
 With Slider2
   .MinValue = 0
   .MaxValue = 1000
   .Value = 100
 End With
  
 With Slider3
  .MinValue = 0
  .MaxValue = 1000
  .Value = 100
 End With
  
End

 
Public Sub Button1_Click()

 pl.Play()
 
 Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 Repeat
   Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo

 pl.Close()

 Print "\n\e[0mEsecuzione terminata !"

End


Public Sub Button2_Click()

 pl.Stop()
 pl.Close()
' Consente di arrestare anche il ciclo del conteggio del tempo trascorso:
 bo = True

End


Public Sub Slider1_Change()  ' Modifica la Tonalità

 pitch = Slider1.Value / 100
 pit["pitch"] = pitch
 ValueBox1.Value = pitch

End


Public Sub Slider2_Change()  ' Modifica il Tempo metronomico

 tempo = Slider2.Value / 100
 pit["tempo"] = tempo
 ValueBox2.Value = tempo

End


Public Sub Slider3_Change()  ' Modifica il Volume

 volume = Slider3.Value / 100
 vol["volume"] = volume          ' "volume" è una proprietà dell'omonimo plugin "volume"
 ValueBox3.Value = volume

End


Public Sub PLine_End()  ' Questo Evento viene sollevato, quando l'operazione è terminata

 bo = True

End


Eseguire un file MP3

Private bo As Boolean


Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, map, mad, vol, snk As MediaControl

 pl = New MediaPipeline As "PLine"
 
 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file.mp3"
 
 map = New MediaControl(pl, "mpegaudioparse")
 mad = New MediaControl(pl, "mpg123audiodec")
 vol = New MediaControl(pl, "volume")         ' <1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100%
 vol["volume"] = 0.5
 snk = New MediaControl(pl, "autoaudiosink")
 src.LinkTo(map)
 map.LinkTo(mad)
 mad.LinkTo(vol)
 vol.LinkTo(snk)

 pl.Play()

 Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 Repeat
   Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo

 pl.Close

 Print "\n\e[0mEsecuzione terminata !"

End


Public Sub PLine_End()  ' Questo Evento viene sollevato, quando l'operazione è terminata

 bo = True

End


Eseguire un file OGG

Private bo as Boolean


Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, dem, vor, vol, snk As MediaControl

 pl = New MediaPipeline As "PLine"

 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file.ogg"

 dem = New MediaControl(pl, "oggdemux")
 vor = New MediaControl(pl, "vorbisdec")
 vol = New MediaControl(pl, "volume")         ' <1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100%
 vol["volume"] = 0.5
 snk = New MediaControl(pl, "autoaudiosink")

 src.LinkTo(dem)
 dem.LinkLaterTo(vor)
 vor.LinkTo(vol)
 vol.LinkTo(snk)

 pl.Play()
 
 Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 Repeat
   Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo

 pl.Close
 
 Write "\nEsecuzione terminata !"
   
End


Public Sub PLine_End()

 bo = True

End


Eseguire un file AAC

Private bo As Boolean


Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, dcd, snk As MediaControl

 pl = New MediaPipeline As "PLine"

 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file.aac"

 dcd = New MediaControl(pl, "faad")
 snk = New MediaControl(pl, "alsasink")
 src.LinkTo(dcd)
 dcd.LinkTo(snk)

 pl.Play()

 Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 Repeat
   Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo

 pl.Close

 Write "\nEsecuzione terminata !"

End


Public Sub PLine_End()
 
 bo = True
 
End


Eseguire un file FLAC

Private bo As Boolean


Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, fpa, fde, snk As MediaControl

 pl = New MediaPipeline As "PLine"

 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file.flac"

 fpa = New MediaControl(pl, "flacparse")
 fde = New MediaControl(pp, "flacdec")
 snk = New MediaControl(pl, "alsasink")

 src.LinkTo(fpa)
 fpa.LinkTo(fde)
 fde.LinkTo(snk)

 pl.Play()

 Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 Repeat
   Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo

 pl.Close

 Write "\nEsecuzione terminata !"

End


Public Sub PLine_End()
 
 bo = True
 
End


Estrarre i Tag da un file audio

E' possibile estrarre da un file gli eventuali Metadati mediante l'Evento "_Tag()" della Classe MediaPipeline.

Mostriamo un esempio che prevede l'estrazione dei Tag metadati da un file audio di formato MP3:

Private pl As MediaPipeline
Private Meta As New Collection
Private ss As New String[]


Public Sub ToggleButton1_Click()

 Dim src, map, mad, snk As MediaControl

 If ToggleButton1.Value Then
   TextArea1.Clear
   pl = New MediaPipeline As "PLine"
   src = New MediaControl(pl, "filesrc")
   src["location"] = "/percorso/del/file/audio"
   map = New MediaControl(pl, "mpegaudioparse")
   mad = New MediaControl(pl, "mpg123audiodec")
   snk = New MediaControl(pl, "autoaudiosink")

   src.LinkTo(map)
   map.LinkTo(mad)
   mad.LinkTo(snk)

   pl.Play

   While pl.Duration < 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


Estrarre i Tag da un file sito in una pagina web

Mostriamo un esempio pratico:

Private pl As MediaPipeline
Private Meta As New Collection
Private ss As New String[]


Public Sub ToggleButton1_Click()

 Dim src, map, mad, snk As MediaControl

 If ToggleButton1.Value Then
   TextArea1.Clear
   pl = New MediaPipeline As "PLine"
   src = New MediaControl(pl, "souphttpsrc")
   src["location"] = "https://samples-files.com/samples/Audio/mp3/sample-file-1.mp3"
   map = New MediaControl(pl, "mpegaudioparse")
   mad = New MediaControl(pl, "mpg123audiodec")
   snk = New MediaControl(pl, "autoaudiosink")

   src.LinkTo(map)
   map.LinkTo(mad)
   mad.LinkTo(snk)

   pl.Play

   While pl.Duration < 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

Se si tratta dell'inirizzo web di una radio om-line, allora useremo il decoder decodebin.
Esempio pratico:

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


Mostrare i plug-in dei visualizzatori grafici 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 pl As MediaPipeline


Public Sub ToggleButton1_Click()
 
 If ToggleButton1.Value Then 
   Dim DrawingArea1 As DrawingArea
   Dim src, dcb, tee, que1, que2 As MediaControl
   Dim vcon, plug, vsnk As MediaControl
   Dim acon, asnk As MediaControl
   Dim tipoPlug As String[] = ["goom", "goom2k1", "monoscope", "spacescope",
                               "spectrascope", "synaescope", "wavescope"]

   With DrawingArea1 = New DrawingArea(Me)
     .X = 10
     .Y = 10
     .W = 300
     .H = 300
     .Background = Color.Black
   End With 

   pl = New MediaPipeline As "PLine"

   src = New MediaControl(pl, "filesrc")
   src["location"] = "/percorso/del/file/audio"
   dcb = New MediaControl(pl, "decodebin")
   tee = New MediaControl(pl, "tee")
   que1 = New MediaControl(pl, "queue")
   vcon = New MediaControl(pl, "audioconvert")
   plug = New MediaControl(pl, tipoPlug[6])
   plug["style"] = 2    [nota 3]
   vsnk = New MediaControl(pl, "ximagesink")
   que2 = New MediaControl(pl, "queue")
   acon = New MediaControl(pl, "audioconvert")
   asnk = New MediaControl(pl, "autoaudiosink")

   src.LinkTo(dcb)
   dcb.LinkLaterTo(tee)
' Parte video:
   tee.LinkTo(que1)
   que1.LinkTo(vcon)
   vcon.LinkTo(plug)
   plug.LinkTo(vsnk)
' Parte audio:
   tee.LinkTo(que2)
   que2.LinkTo(acon)
   acon.LinkTo(asnk)
' Si dice al MediaControl di mostrare il proprio output (gli effetti video) in uno specifico controllo GUI, solitamente una DrawingArea:
   vsnk.SetWindow(DrawingArea1)

   pl.Play()
   While (pl.Duration < 0.1) Or (pl.Pos < 0.1)
     Wait 0.01
   Wend

   Wait pl.Duration

 Else 
   pl.Stop
   pl.Close
 Endif 
   
End


Public Sub PLine_Position()
 
 Me.Title = Str(Time(0, 0, 0, pl.Pos * 1000))

End


Public Sub PLine_End()

 pl.Close
 ToggleButton1.Value = False

End


Interfacciare le Classi MediaControl e MediaPipeline con il plugin "jackaudiosink" di GStreamer per eseguire i file audio

Per eseguire i file audio con le Classi MediaControl e MediaPipeline è possibile anche effettuare un interfacciamento tra il programma Gambas e il server audio JACK. Per fare ciò, ci si servirà dell'apposito plugin di GStreamer, chiamato "jackaudiosink".

Ovviamente bisognerà avere l'accortezza di avviare il server Jack (per esempio avviando il programma qjackctl) prima di lanciare il programma Gambas.

All'avvio del programma viene creata dal server Jack una connessione tra il programma sorgente Gambas e la destinazione (di default il primo canale audio d'uscita disponibile della propria scheda audio).


Mostriamo un semplice esempio di esecuzione di un file wav in un'applicazione a riga di comando:

Private bo As Boolean


Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, prs, cnv, snk As MediaControl

 pl = New MediaPipeline As "PLine"
  
 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file.wav"
 prs = New MediaControl(pl, "wavparse")
 cnv = New MediaControl(pl, "audioconvert")
 snk = New MediaControl(pl, "jackaudiosink")
 
 src.LinkTo(prs)
 prs.LinkTo(cnv)
 cnv.LinkTo(snk)
  
 pl.Play()

 Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 Repeat
   Write "\r\e[0mTempo trascorso:   \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo

 pl.Close()

 Write "\nEsecuzione terminata !"

End


Public Sub PLine_End()
 
 bo = True
 
End


Note

[1] Nel sistema multimediale GStreamer una "Pipeline " è una sequenza di elementi collegati tra loro, e costituisce la struttura su cui si basa GStreamer per processare un flusso multimediale.
Il flusso dati che attraversa la pipeline consiste in una combinazione di buffer ed eventi. Gli eventi contengono informazioni di controllo, come la notifica di ricezione di un metadato, di un comando di seeking (ad esempio permettere in stato di “pause” la pipeline) oppure la fine dello stream (EOS). Il buffer è l’unità base in cui un segnale è suddiviso.
Il segnale viene partizionato in buffer già dal primo elemento che fa da source (sorgente). Dopodiché l’elemento successivo riceve il buffer tramite la sua interfaccia sink-pad, e lo passa all’elemento seguente tramite il suo source-pad, e così via fino all’ultimo elemento che riceverà il buffer.

[2] Per avere contezza di quali siano i plugin ed i filtri da utilizzare, è opportuno vedere sulla rete la documentazione di GStreamer e gli eventuali esempi pratici.

[3] Sullo stile dell'elemento "wavescope" vedere: Stile wavescope