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

Da Gambas-it.org - Wikipedia.
Riga 22: Riga 22:
 
    
 
    
 
  '''End'''
 
  '''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''.
Riga 40: Riga 39:
 
    
 
    
 
   Print "Durata: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Print "Durata: "; 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[31m        " & Str(Time(0, 0, 0, pl.Position * 1000))
Riga 58: Riga 56:
 
===Eseguire file audio di vari formati===
 
===Eseguire file audio di vari formati===
 
In questo caso si utlizzerà il plug-in "decodebin".
 
In questo caso si utlizzerà il plug-in "decodebin".
 +
Private bo As Boolean
 +
 +
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
Riga 66: Riga 67:
 
   fileaudio = "<FONT color=gray>''/percorso/del/file/audio''</font>"
 
   fileaudio = "<FONT color=gray>''/percorso/del/file/audio''</font>"
 
    
 
    
   pl = New MediaPipeline
+
   pl = New MediaPipeline As "PLine"
 
    
 
    
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
Riga 81: Riga 82:
 
   pl.Play
 
   pl.Play
 
    
 
    
   Print "\rDurata del video: "; Time(0, 0, 0, pl.Duration * 1000)
+
   Print "\rDurata del video: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Repeat
 
   Repeat
     Write "\r\e[0mTempo trascorso:  \e[31m" & Time(0, 0, 0, pl.Position * 1000)
+
     Write "\r\e[0mTempo trascorso:  \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
 
     Wait 0.001
 
     Wait 0.001
   Until pl.Position >= pl.Duration
+
   Until bo
 
+
 
   pl.Stop
 
   pl.Stop
 
   pl.Close
 
   pl.Close
 
+
 
   Print "\n\e[0mEsecuzione terminata !"
 
   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'''
 
  '''End'''
  
Riga 97: Riga 104:
 
===Eseguire un file WAV===
 
===Eseguire un file WAV===
 
In questo caso si utilizzeranno i plug-in specifici per eseguire un file di formato WAV.
 
In questo caso si utilizzeranno i plug-in specifici per eseguire un file di formato WAV.
 +
Private bo As Boolean
 +
 +
 
  '''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, snk As MediaControl
 
+
   pl = New MediaPipeline  
+
   pl = New MediaPipeline As "PLine"
   
+
 
   src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>")
 
   src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>")
 
   src["location"] = "<FONT color=gray>''/percorso/del/file.wav''</font>"  <FONT color=gray>' ''"location" è una proprietà del plugin "filesrc"''</font>
 
   src["location"] = "<FONT color=gray>''/percorso/del/file.wav''</font>"  <FONT color=gray>' ''"location" è una proprietà del plugin "filesrc"''</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, "<FONT color=#B22222>audioconvert</font>")
Riga 113: Riga 123:
 
   dcd.LinkTo(cnv)
 
   dcd.LinkTo(cnv)
 
   cnv.LinkTo(snk)
 
   cnv.LinkTo(snk)
   
+
 
   pl.Play()
 
   pl.Play()
       
+
 +
  Print "\rDurata del video: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Repeat
 
   Repeat
     Write "\rTempo: " & Time(0, 0, 0, pl.Position * 1000)
+
     Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
     Wait 0.001
+
     Wait 0.01
   Until pl.Position >= pl.Duration  <FONT color=gray>' ''La Proprietà ".Duration" è disponibile nell'esecuzione dei file WAV''</font>
+
   Until bo
 
+
 
   pl.Stop()
 
   pl.Stop()
 
   pl.Close()
 
   pl.Close()
   
+
 +
'''End'''
 +
 +
'''Public''' Sub PLine_End()  <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font>
 +
 +
  bo = True
 +
 
  '''End'''
 
  '''End'''
  
Riga 135: Riga 152:
 
  Private tempo As Float = 1.00
 
  Private tempo As Float = 1.00
 
  Private volume As Float = 1.00
 
  Private volume As Float = 1.00
 +
Private bo As Boolean
 
   
 
   
 
   
 
   
Riga 142: Riga 160:
 
   Dim flt As MediaFilter
 
   Dim flt As MediaFilter
 
    
 
    
  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>"
+
  src["location"] = "<FONT color=gray>''/percorso/del/file.wav''</font>"
  par = New MediaControl(pl, "wavparse")
+
  par = New MediaControl(pl, "wavparse")
  cnv = New MediaControl(pl, "audioconvert")
+
  cnv = New MediaControl(pl, "audioconvert")
  res = New MediaControl(pl, "audioresample")
+
  res = New MediaControl(pl, "audioresample")
  flt = New MediaFilter(pl, "audio/x-raw,rate=44100,channels=2")
+
  flt = New MediaFilter(pl, "audio/x-raw,rate=44100,channels=2")
  pit = New MediaControl(pl, "pitch")
+
  pit = New MediaControl(pl, "pitch")
  vol = New MediaControl(pl, "volume")
+
  vol = New MediaControl(pl, "volume")
  cnv2 = New MediaControl(pl, "audioconvert")
+
  cnv2 = New MediaControl(pl, "audioconvert")
  snk = New MediaControl(pl, "alsasink")
+
  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)
 
 
    
 
    
 +
  src.LinkTo(par)
 +
  par.LinkTo(cnv)
 +
  cnv.LinkTo(res)
 +
  res.LinkTo(flt)
 +
  flt.LinkTo(pit)
 +
  pit.LinkTo(cnv2)
 +
  cnv2.LinkTo(vol)
 +
  vol.LinkTo(snk)
 +
 
 
  <FONT Color=gray>' ''Imposta alcuni valori dei due "Slider":''</font>
 
  <FONT Color=gray>' ''Imposta alcuni valori dei due "Slider":''</font>
  With Slider1
+
  With Slider1
    .MinValue = 0
+
    .MinValue = 0
    .MaxValue = 1000
+
    .MaxValue = 1000
    .Value = 100
+
    .Value = 100
  End With
+
  End With
 
    
 
    
  With Slider2
+
  With Slider2
    .MinValue = 0
 
    .MaxValue = 1000
 
    .Value = 100
 
  End With
 
 
 
  With Slider3
 
 
     .MinValue = 0
 
     .MinValue = 0
 
     .MaxValue = 1000
 
     .MaxValue = 1000
 
     .Value = 100
 
     .Value = 100
   End With
+
  End With
 +
    
 +
  With Slider3
 +
  .MinValue = 0
 +
  .MaxValue = 1000
 +
  .Value = 100
 +
  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))
 
   Repeat
 
   Repeat
     Write #File.Out, "\rDurata del brano: " & CStr(Time(0, 0, 0, pl.Duration * 1000)) & "  -  Tempo trascorso: " & CStr(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)   <FONT color=gray>' ''La Proprietà ".Duration" è disponibile nell'esecuzione dei file WAV''</font>
+
   Until bo
 
+
 +
  pl.Close()
 +
 
  '''End'''
 
  '''End'''
 
   
 
   
 +
'''Public''' Sub Button2_Click()
 
   
 
   
'''Public''' Sub Button2_Click()
 
 
 
 
   pl.Stop()
 
   pl.Stop()
 
   pl.Close()
 
   pl.Close()
 
+
 
  '''End'''
 
  '''End'''
 
   
 
   
 +
'''Public''' Sub Slider1_Change()
 
   
 
   
'''Public''' Sub Slider1_Change()
 
 
 
 
   pitch = Slider1.Value / 100
 
   pitch = Slider1.Value / 100
 
   pit["pitch"] = pitch
 
   pit["pitch"] = pitch
 
   ValueBox1.Value = pitch
 
   ValueBox1.Value = pitch
 
+
 
  '''End'''
 
  '''End'''
 
   
 
   
 +
'''Public''' Sub Slider2_Change()
 
   
 
   
'''Public''' Sub Slider2_Change()
 
 
 
 
   tempo = Slider2.Value / 100
 
   tempo = Slider2.Value / 100
 
   pit["tempo"] = tempo
 
   pit["tempo"] = tempo
 
   ValueBox2.Value = tempo
 
   ValueBox2.Value = tempo
 
+
 
  '''End'''
 
  '''End'''
 
   
 
   
 +
'''Public''' Sub Slider3_Change()
 
   
 
   
'''Public''' Sub Slider3_Change()
 
 
 
 
   volume = Slider3.Value / 100
 
   volume = Slider3.Value / 100
 
   vol["volume"] = volume          <FONT Color=gray>' ''"volume" è una proprietà dell'omonimo plugin "volume"''</font>
 
   vol["volume"] = volume          <FONT Color=gray>' ''"volume" è una proprietà dell'omonimo plugin "volume"''</font>
 
   ValueBox3.Value = volume
 
   ValueBox3.Value = volume
    
+
 +
'''End'''
 +
 +
'''Public''' Sub PLine_End()  <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font>
 +
 +
   bo = True
 +
 
  '''End'''
 
  '''End'''
  
  
 
===Eseguire un file MP3===
 
===Eseguire un file MP3===
 +
Private bo As Boolean
 +
 +
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
Riga 242: Riga 267:
 
   fileMP3 ="<FONT color=gray>''/percorso/del/file.mp3''</font>"
 
   fileMP3 ="<FONT color=gray>''/percorso/del/file.mp3''</font>"
 
    
 
    
   pl = New MediaPipeline As "MediaP"
+
   pl = New MediaPipeline As "PLine"
 
    
 
    
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
Riga 253: Riga 278:
 
   map.LinkTo(mad)
 
   map.LinkTo(mad)
 
   mad.LinkTo(snk)
 
   mad.LinkTo(snk)
 
+
 
   pl.Play()
 
   pl.Play()
    
+
 +
   Print "\rDurata del video: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Repeat
 
   Repeat
     Write "\rTempo: " & Time(0, 0, 0, pl.Position * 1000)
+
     Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
     Wait 0.001
+
     Wait 0.01
   Until pl.Position >= pl.Duration
+
   Until bo
 
+
 
   pl.Stop
 
   pl.Stop
 
   pl.Close
 
   pl.Close
  <FONT color=#B22222>pl = Null</font>  <FONT color=gray>' ''Consente di evitare l'uso della funzione "Quit" per chiudere definitivamente il programma''</font>
+
    
+
'''End'''
 +
 +
'''Public''' Sub PLine_End()  <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font>
 +
 +
   bo = True
 +
 
  '''End'''
 
  '''End'''
  
Riga 633: Riga 664:
  
 
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.
 
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 pl As MediaPipeline
 
 
  Private bo As Boolean
 
  Private bo As Boolean
 
   
 
   
Riga 639: Riga 669:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
 +
  Dim pl As MediaPipeline
 
   Dim fileMP3 As String
 
   Dim fileMP3 As String
 
   Dim src, map, mad, snk As MediaControl
 
   Dim src, map, mad, snk As MediaControl
 
   Dim tm As Date
 
   Dim tm As Date
 
    
 
    
   pl = New MediaPipeline As "MediaP"
+
   pl = New MediaPipeline As "PLine"
 
    
 
    
 
   fileMP3 ="<FONT color=gray>''/percorso/del/file.mp3''</font>"
 
   fileMP3 ="<FONT color=gray>''/percorso/del/file.mp3''</font>"
Riga 658: Riga 689:
 
    
 
    
 
   pl.Play()
 
   pl.Play()
 
+
  tm = Now
 
 
 
 
   Repeat
 
   Repeat
     Write "\rTempo: " & Time(0, 0, 0, pl.Position * 1000)
+
     Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
     Wait 0.001
+
     Wait 0.01
   Until bo == True
+
   Until bo
 
+
 
   pl.Stop
 
   pl.Stop
 
   pl.Close
 
   pl.Close
  pl = Null
 
 
    
 
    
 
  '''End'''
 
  '''End'''
 
   
 
   
+
  '''Public''' Sub PLine_End()
  '''Public''' Sub MediaP_End()
 
 
    
 
    
 
   bo = True
 
   bo = True
Riga 686: Riga 713:
 
   Dim src, dem, vor, snk As MediaControl
 
   Dim src, dem, vor, snk As MediaControl
 
    
 
    
   pl = New MediaPipeline As "PL"
+
   pl = New MediaPipeline As "PLine"
 
      
 
      
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
Riga 701: Riga 728:
 
   pl.Play()
 
   pl.Play()
 
          
 
          
 +
  Print "\rDurata del video: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Repeat
 
   Repeat
     Write "\rTempo: " & 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  <FONT color=gray>' ''La Proprietà ".Duration" è disponibile nell'esecuzione dei file OGG''</font>
+
   Until bo
 
+
 
   pl.Stop
 
   pl.Stop
 
   pl.Close
 
   pl.Close
   pl = Null
+
    
 
 
 
   Write "\nEsecuzione terminata !"
 
   Write "\nEsecuzione terminata !"
 
      
 
      
 +
'''End'''
 +
 +
'''Public''' Sub PLine_End()
 +
 +
  bo = True
 +
 
  '''End'''
 
  '''End'''
  
  
 
===Eseguire un file AAC===
 
===Eseguire un file AAC===
Private pl As MediaPipeline
 
 
  Private bo As Boolean
 
  Private bo As Boolean
 
   
 
   
Riga 725: Riga 757:
 
   Dim src, dcd, snk As MediaControl
 
   Dim src, dcd, snk As MediaControl
 
    
 
    
   pl = New MediaPipeline As "PL"  
+
   pl = New MediaPipeline As "PLine"
 
      
 
      
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
Riga 737: Riga 769:
 
   pl.Play()
 
   pl.Play()
 
      
 
      
 +
  Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Repeat
 
   Repeat
     Write "\rTempo: " & 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 = True
+
   Until bo
 
+
 
   pl.Stop
 
   pl.Stop
 
   pl.Close
 
   pl.Close
Riga 749: Riga 782:
 
  '''End'''
 
  '''End'''
 
   
 
   
+
  '''Public''' Sub PLine_End()
  '''Public''' Sub PL_End()
 
 
    
 
    
 
   bo = True
 
   bo = True
Riga 758: Riga 790:
  
 
===Eseguire un file FLAC===
 
===Eseguire un file FLAC===
 +
Private bo As Boolean
 +
 +
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
Riga 763: Riga 798:
 
   Dim src, fpa, fde, snk As MediaControl
 
   Dim src, fpa, fde, snk As MediaControl
 
    
 
    
   pl = New MediaPipeline
+
   pl = New MediaPipeline As "PLine"
 
      
 
      
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
Riga 778: Riga 813:
 
   pl.Play()
 
   pl.Play()
 
    
 
    
 +
  Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 
   Repeat
 
   Repeat
     Write #File.Out, "\rTempo: " & Time(0, 0, 0, pl.Position * 1000)
+
     Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
    Flush #File.Out
 
 
     Wait 0.01
 
     Wait 0.01
   Until pl.Position >= pl.Duration  <FONT color=gray>' ''La Proprietà ".Duration" è disponibile nell'esecuzione dei file FLAC''</font>
+
   Until bo
 
      
 
      
 
   pl.Stop
 
   pl.Stop
Riga 791: Riga 826:
 
  '''End'''
 
  '''End'''
  
 +
'''Public''' Sub PLine_End()
 +
 
 +
  bo = True
 +
 
 +
'''End'''
  
  

Versione delle 15:58, 17 set 2022

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]

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.

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

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim s As String
 
 pl = New MediaPipeline(Null, "playbin")
 pl["uri"] = Media.URL("/percorso/del/file/audio")
  
 pl.Play()
  
' 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.
 Input s
  
 pl.Stop
 pl.Close
  
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.

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim mc As MediaControl
 Dim tm As Date
 
 pl = New MediaPipeline
  
 mc = New MediaControl(pl, "playbin")
 mc["uri"] = Media.URL("/percorso/del/file/audio")
  
 pl.Play()
 
 Print "Durata: "; Str(Time(0, 0, 0, pl.Duration * 1000))
 Repeat
   Write "\r\e[31m        " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until pl.Position >= pl.Duration
  
 pl.Stop
 pl.Close
 
End

Utilizzare i plugin di GStreamer con le Classi MediaControl e MediaPipeline per eseguire i file 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 file audio di vari formati

In questo caso si utlizzerà il plug-in "decodebin".

Private bo As Boolean


Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src,bin, con, ask As MediaControl
 Dim fileaudio As String
 
 fileaudio = "/percorso/del/file/audio"
 
 pl = New MediaPipeline As "PLine"
 
 src = New MediaControl(pl, "filesrc")
 src["location"] = fileaudio
 
 bin = New MediaControl(pl, "decodebin")
 con = New MediaControl(pl, "audioconvert")
 ask = New MediaControl(pl, "autoaudiosink")
 
 src.LinkTo(bin)
 bin.LinkLaterTo(con)
 con.LinkTo(ask)
 
 pl.Play
 
 Print "\rDurata del video: "; 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.001
 Until bo

 pl.Stop
 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 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, snk As MediaControl

 pl = New MediaPipeline As "PLine"

 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file.wav"   ' "location" è una proprietà del plugin "filesrc"

 dcd = New MediaControl(pl, "wavparse")
 cnv = New MediaControl(pl, "audioconvert")
 snk = New MediaControl(pl, "alsasink")
 src.LinkTo(dcd)
 dcd.LinkTo(cnv)
 cnv.LinkTo(snk)

 pl.Play()

 Print "\rDurata del video: "; 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.Stop()
 pl.Close()

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 di esecuzione si userà la proprietà "tempo": 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 del video: "; 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()

End

Public Sub Button2_Click()

 pl.Stop()
 pl.Close()

End

Public Sub Slider1_Change()

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

End

Public Sub Slider2_Change()

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

End

Public Sub Slider3_Change()

 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 fileMP3 As String
 Dim pl As MediaPipeline
 Dim src, map, mad, snk As MediaControl
 
 fileMP3 ="/percorso/del/file.mp3"
 
 pl = New MediaPipeline As "PLine"
 
 src = New MediaControl(pl, "filesrc")
 src["location"] = fileMP3
 
 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()

 Print "\rDurata del video: "; 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.Stop
 pl.Close

End

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

 bo = True

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. [Nota 3]

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 = "/percorso/del/file.mp3"
  
  pl = New MediaPipeline 
   
  src = New MediaControl(pl, "filesrc")
  src["location"] = fileMP3
   
  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()
  
' Invoca la funzione per ottenere la durata del file audio MP3:
  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
  
' Libera la memoria e va in chiusura:
   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)
' 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.
 
' Viene individuata la versione del file mp3:
      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
      
' Viene individuato il "Layer" del file mp3:
      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
      
' 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.
      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
  
  ' 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
   durata = Fix((Len(s) / bitrate) * 8)
  ' Endif
  
  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
 
 Dim velCamp As Short
 
  If Vmpeg = "1" Then   ' Nel caso di Mpeg vers. 1
    Select Case layB    ' Verifica il Layer
      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     ' Verifica il Layer
      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


Private Function EstraeFrequenza(Vmpeg As String, fre As Byte) As Integer
 
 Dim frq As Integer
 
   Select Case Vmpeg
     Case "1"          ' Nel caso di Mpeg vers. 1
      Select Case fre
        Case 0
          frq = 44100
        Case 4
          frq = 48000
        Case 8
          frq = 32000
      End Select
    Case "2"           ' Nel caso di Mpeg vers. 2
      Select Case fre
        Case 0
          frq = 22050
        Case 4
          frq = 24000
        Case 8
          frq = 16000
      End Select
    Case "2.5"         ' Nel caso di Mpeg vers. 2.5
      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 ="/percorso/del/file.mp3"
 
 src = New MediaControl(pl, "filesrc")
 src["location"] = fileMP3
 
 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"] = "/percorso/del/file.ogg"
   
 dem = New MediaControl(pl, "oggdemux")
 vor = New MediaControl(pl, "vorbisdec")
 snk = New MediaControl(pl, "alsasink")
   
 src.LinkTo(dem)
 dem.LinkLaterTo(vor)
 vor.LinkTo(snk)
   
 pl.Play()
       
 Print "\rDurata del video: "; 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.Stop
 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.Stop
 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"   ' "location" è una proprietà del plugin "filesrc"
   
 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.Stop
 pl.Close
  
 Write "\nEsecuzione terminata !"
   
End
Public Sub PLine_End()
 
 bo = True
 
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:

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

 pl = New MediaPipeline 
  
 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file.wav"      ' "location" è una proprietà del plugin "filesrc"
 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 "\nDurata: " & Time(0, 0, 0, pl.Duration * 1000)
 Wait pl.Duration
 
 pl.Stop()
 pl.Close()
  
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] Si segnalano come riferimento le seguenti pagine della Wiki: