Eseguire i file audio mediante il componente gb.media

Da Gambas-it.org - Wikipedia.

Di seguito vedremo due Classi, fornite dal Componente gb.media, con le quali è possibile attraverso varie modalità eseguire i file audio.


La classe MediaPlayer

La classe MediaPlayer del componente gb.media consente di gestire uno o più file audio anche contemporaneamente.


Uso di applicazione grafica

Vediamo un semplicissimo codice per lanciare ed ascoltare un file audio in un'applicazione grafica utilizzando un Timer.
Porremo sul Form del progetto:

  • tre Button per avviare, mettere in pausa ed arrestare l'esecuzione del file audio;
  • un Timer che ci consentirà di calcolare il tempo trascorso;
  • un RadioButton per far ripetere a volontà il medesimo file audio:
Private mp As New MediaPlayer


Public Sub Form_Open()

' Carica un file audio:
  mp.URL = Media.URL("/percorso/del/file/audio")

' Facciamo in modo che il "Timer", alla sua prima attivazione, parta senza alcun ritardo:
  Timer1.Delay = 1

End
 

Public Sub Button1_Click()

  suona()

End

Public Sub suona()
 
' Avvia l'ascolto del file audio:
  mp.Play

  With Timer1
    .Start
' Il "Timer" si attiva ogni 70 millesimi di secondo:
    .Delay = 70
  End With

End

Public Sub Button2_Click()

' Mette in "pausa" l'ascolto del file audio.
' (Per continuare l'ascolto del file, si dovrà nuovamente attivare la proprietà ".Play"):
  mp.Pause

End

Public Sub Button3_Click()

  RadioButton1.Value = False

' Chiama la funzione per arrestare l'esecuzione del file audio:
  arresta()

End


Public Sub arresta()

' Arresta l'ascolto del file audio:
  mp.Stop

  Timer1.Stop

' Se è stato cliccato sul "RadioButton", verrà ripetuta l'esecuzione del file audio:
  If RadioButton1.Value Then
    mp.Position = 0
    suona()
  Else
' Arresta l'ascolto del file audio:
   mp.Stop
 Endif

End


Public Sub Timer1_Timer()

' Mostra in console la posizione, espressa in secondi, all'interno dei dati processati:
  Write #File.Out, "\rDurata del brano: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Duration * 1000)) & "   -   Tempo trascorso: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Position * 1000))

' Se la posizione corrente è uguale o maggiore della durata complessiva del file audio,
' allora arresta l'esecuzione del file audio (altrimenti non sarà possibile riavviarlo semplicemente ri-clkiccando sul "Button1"):
  If mp.Position >= mp.Duration Then arresta()
 
End


In quest'altro esempio, simile al precedente, verrà utilizzato un ciclo al posto di un oggetto Timer. Si porrà anche un oggetto Dial per poter modificare il volume.

Private mp As New MediaPlayer
Private bo As Boolean


Public Sub Form_Open()

  With Dial1
    .MinValue = 0
    .MaxValue = 100
    .Value = 50
  End With
  
' Carica un file audio:
  mp.URL = Media.URL("/percorso/del/file/audio")

End
 

Public Sub Button1_Click()

  suona()

End


Public Sub suona()

' Avvia l'ascolto del file audio:
  mp.Play
  
  Do
' Una brevissima pausa consente di agire sugli eventuali oggetti posti sul Form:
    Wait 0.01
    Write #File.Out, "\rDurata del brano: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Duration * 1000)) & "   -   Tempo trascorso: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Position * 1000))
  Loop Until (mp.Position >= mp.Duration) Or (bo = True)
 
  arresta()
 
End


Public Sub Button2_Click()
 
' Mette in "pausa" l'ascolto del file audio.
' (Per continuare l'ascolto del file, si dovrà nuovamente attivare la proprietà ".Play").
  mp.Pause

End


Public Sub Button3_Click()
 
  RadioButton1.Value = False
 
  bo = True
 
End


Public Sub arresta()
 
' Se è stato cliccato sul "RadioButton", verrà ripetuta l'esecuzione del file audio:
  If RadioButton1.Value Then
    mp.Position = 0
    suona()
  Else
' Altrimenti arresta l'ascolto del file audio:
    mp.Stop
  Endif
 
End


Public Sub Dial1_Change()
 
  mp.Audio.Volume = Dial1.Value / 10
  Wait 0.1
 
End


Utilizzo in un'applicazione a riga di comando

Vediamo ora un semplice esempio di uso della Classe MediaPlayer in un'applicazione a riga di comando:

Private bo As Boolean


Public Sub Main()

 Dim mp As MediaPlayer
  
  With mp = New MediaPlayer
    .URL = Media.URL("/percorso/del/file/audio")
    .Play
  End With
  
  Do
' Mostra in console la posizione, espressa in secondi, all'interno dei dati processati:
    Write #File.Out, "\rDurata del brano: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Duration * 1000)) & "   -   Tempo trascorso: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Position * 1000))
    Wait 0.01
  Loop Until (mp.Position >= mp.Duration) Or (bo = True)
  
  mp.Stop
  
  Quit
  
End


Public Sub Application_Read()   ' Premendo il tasto "Invio" della tastiera, si arresta il programma
 
  bo = True
  
End


La proprietà .Duration

La proprietà .Duration restituisce un valore di tipo Float che rappresenta la durata del brano musicale espresso in secondi.
Poiché detta proprietà ritorna più precisamente la durata dei dati processati, essa potrà essere utilizzabile solo successivamente all'attivazione della funzione .Play. Per essere funzionante in modo automatico, potrà essere posta all'interno di una routine di attivazione di un Timer (vedi esempio precedente).


La proprietà .Position

La proprietà .Position restituisce un valore di tipo Float che rappresenta la posizione, espressa in secondi all'interno dei dati processati.
Imposta, altresì, la posizione di esecuzione del brano. Pertanto, essa consente di spostare il processo dei dati, e dunque l'esecuzione del brano, ad un particolare punto temporale.


Modificare il Volume

Per conoscere o modificare il livello del volume d'ascolto si dovrà utilizzare la proprietà ".Volume" della proprietà .Audio della Classe MediaPlayer. Più in particolare la proprietà ".Volume" ritorna od imposta il volume del corrente flusso audio.

Nel primo caso restituisce un valore di tipo Float che rappresenta il volume corrente:

valore_di_tipo_Float = mp.Audio.Volume

nel secondo caso il volume è impostato mediante un valore di tipo Float, il cui ambito di valori impostabili va da 0.00 a 10.00:

mp.Audio.Volume = valore_di_tipo_Float


Annullare l'audio immediatamente

Per annullare l'audio immediatamente, senza modificare i valori del volume, si ha a disposizione la proprietà ".Mute" della proprietà .Audio della Classe MediaPlayer. Alla proprietà .Mute dovrà essere assegnato il valore booleano True.

mp.Audio.Mute = True


L'evento _AboutToFinish

L'evento _AboutToFinish si scatena circa un secondo prima della fine della durata del file audio che si sta eseguendo.


L'evento _End

L'evento _End si scatena quando la durata del file è terminata.


Estrarre i Tag da un file audio

Per estrarre i Tag da un file audio si utilizzerà l'evento _Tag della Classe MediaPlayer. L'evento avrà come parametro una variabile, del tipo MediaTagList, che conterrà la lista dei Tag trovati.

Private mp As New MediaPlayer As "mp"


Public Sub Button1_Click()

  mp.URL = Media.URL("/percorso/del/file/audio")
 
  mp.Play
 
End


' Se ci sono "Tag" nel file audio, verrà sollevato il seguente evento:
Public Sub mp_Tag(tagLista As MediaTagList)
 
 Dim sTag As String
 
   For Each sTag In tagLista.Tags
' Vediamo in console i Tag trovati del file audio:
     Print sTag, Str(tagLista[sTag])
   Next
 
End

V'è da evidenziare che l'evento _Tag sarà sollevato solo con l'attivazione della funzione .Play .


Gli effetti video con i plug-in

E' possibile ottenere simpatici effetti video utilizzando i plug-in resi disposibili da GStreamer.

In tal caso si farà uso anche della Classe MediaControl che è serve per gestire appositamente i plug-in di GStreamer.


Mostreremo di seguito il codice esenziale per l'utilizzo degli effeti video con i plug-In (si inserirà anche una DrawingArea, che chiameremo drVid, sul Form):

Private mp As New MediaPlayer As "mp"
Private uscitaVideo As MediaControl
Private arrVis As MediaControl[]   ' Un array di variabili di tipo "MediaControl", ossia di vari PlugIn disponibili
 

Public Sub Form_Open()

  avviaPlugin()

  With mp
   .URL = Media.URL("/percorso/del/file/audio")
   .State = 4
   .State = 2
  End With

  Wait 0.1

' Se viene impostato uno specifico controllo GUI (solitamente una DrawingArea),
' l'effetto video sarà mostrato all'interno di quel controllo.
' Se, invece, non verrà impostato alcun controllo GUI, allora l'effetto video sarà mostrato in un controllo esterno al Form.
' Nel presente esempio impostiamo una "DrawingArea" (che qui chiamiamo "drVid"), e così diciamo "al MediaControl
' di mostrare il proprio output (gli effetti video) in quello specifico controllo GUI (appunto la DrawingArea):
  uscitaVideo.SetWindow(drVid)

' Esegue il brano:
  mp.Play()
 
End


Public Sub avviaPlugin()

' Istanzia il controllo di uscita video da usare. In questo caso sarà "ximagesink",
' un "videosink" basato sullo standard X, e che è esso stesso un plug-in:
   uscitaVideo = New MediaControl(mp, "ximagesink")
 
' Imposta il controllo di uscita video da usare:
   mp.Video.Output = uscitaVideo
 

   arrVis = New MediaControl[]

' Nella variabile array di tipo "MediaControl" vengono aggiunti i diversi PlugIn disponibili.
' Il primo elemento dell'array deve essere sostanzialmente vuoto. Se si sceglie questa opzione, non sarà visualizzato alcun motivo:
   aggiunVis("", "")

' Ecco alcuni disponibili:
   aggiunVis("goom", "Goom")
' Monoscopio è un plugin che consente di visualizzare una forma d'onda altamente stabilizzata di ingresso audio
   aggiunVis("monoscope", "Mono")
   aggiunVis("spacescope", "Space")
   aggiunVis("spectrascope", "Spectra")
   aggiunVis("synaescope", "Synae")
' Oscilloscopio a forma d'onda semplice:
   aggiunVis("wavescope", "Wave")

' Viene impostato inizialmente il "plugin" fra quelli sopra indicati:
   aggioVis(7)

End


Public Sub aggiunVis(tipoPlug As String, titolo As String)
 
 Dim hVis As MediaControl

' La variabile "tipoPlug" contiene il tipo di plug'in...
   If tipoPlug Then hVis = New MediaControl(mp, tipoPlug)
 
' ...che viene aggiunta agli elementi della omogenea variabile array:
   arrVis.Add(hVis)

   Catch
     Error tipoPlug; ": "; Error.Text
 
End


Public Sub aggioVis(iVis as Byte)

 Dim hVis As MediaControl = arrVis[iVis - 1]

' Imposta il plug-in da utilizzare:
   mp.Video.Visualisation = hVis

' Anche qui viene impostata la "DrawingArea", ove mostrare gli effetti video:
   uscitaVideo.SetWindow(drVid)
 
End


Public Sub Button1_Click()

' Modificando il valore della seguente variabile integer si modifica anche il tipo di visualizzazione
   aggioVis(Fix(Rnd(2, 8)))

End


La Classe MediaPipeline

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.

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
 
 
  pl = New MediaPipeline(Null, "playbin")
  pl["uri"] = Media.URL("/percorso/del/file/audio")
  
  pl.State = Media.Playing
  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
  
End


Il plugin "playbin" può anche essere inserito all'interno di un oggetto della Classe MediaControl, la quale rappresenta un Elemento ordinario di GStreamer.

 Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim mc As MediaControl
 
 
  pl = New MediaPipeline
  
  mc = New MediaControl(pl, "playbin")
  mc["uri"] = Media.URL("/percorso/del/file/audio")
  
  pl.State = Media.Playing
  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
  
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 1 ] con le Classi MediaControl e MediaPipeline.

Mostriamo di seguito un paio di esempi per l'esecuzione di file audio.

Eseguire un file WAV

Public Sub Main()
 
 Dim pp As MediaPipeline
 Dim src, dcd, cnv, snk As MediaControl
 
   pp = New MediaPipeline 
   
   src = New MediaControl(pp, "filesrc")
   src["location"] = "/percorso/del/file.wav"   ' "location" è una proprietà del plugin "filesrc"
   
   wprs = New MediaControl(pp, "wavparse")
   cnv = New MediaControl(pp, "audioconvert")
   alsa = New MediaControl(pp, "alsasink")
   src.LinkTo(dcd)
   dcd.LinkTo(cnv)
   cnv.LinkTo(snk)
   
   pp.State = Media.Playing
   pp.Play()
   
   Sleep 1
   
   While pp.Duration > pp.Position
     Write #File.Out, "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pp.Position * 1000)
   Wend
   
End


Eseguire un file MP3

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, dcd, snk As MediaControl
 
   pl = New MediaPipeline 
   
   src = New MediaControl(pl, "filesrc")
   src["location"] = "/percorso/del/file.mp3"   ' "location" è una proprietà del plugin "filesrc"
   
   dcd = New MediaControl(pl, "mad")
   snk = New MediaControl(pl, "alsasink")
   src.LinkTo(dcd)
   dcd.LinkTo(snk)
   
   pl.State = Media.Playing
   pl.Play()
   
   Sleep 1
   
   While pl.Duration > pl.Position
     Write #File.Out, "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000)
   Wend
   
End



Note

[1] 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.