Differenze tra le versioni di "La gestione dei file audio mediante il componente gb.media"

Da Gambas-it.org - Wikipedia.
 
(18 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Il componente '''gb.media''' offre la possibilità di sfruttare le funzionalità della piattaforma multimediale modulare ''GStreamer'' per la gestione di file audio.
+
#REDIRECT [[La_gestione_dell'audio_e_dei_file_audio_mediante_il_componente_gb.media]]
 
 
 
 
=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''.
 
<BR>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 <FONT color=#B22222>MediaPlayer</font>
 
 
 
'''Public''' Sub Form_Open()
 
 
<FONT color=gray>' ''Carica un file audio:''</font>
 
  mp.URL = Media.URL("''/percorso/mio/file/audio''")
 
 
<FONT color=gray>' ''Facciamo in modo che il "Timer", alla sua prima attivazione, parta senza alcun ritardo:''</font>
 
  Timer1.Delay = 1
 
 
'''End'''
 
 
 
 
'''Public''' Sub Button1_Click()
 
 
  suona()
 
 
'''End'''
 
 
'''Public''' Sub suona()
 
 
 
<FONT color=gray>' ''Avvia l'ascolto del file audio:''</font>
 
  mp.<FONT color=#B22222>Play</font>
 
 
  With Timer1
 
    .Start
 
<FONT color=gray>' ''Il "Timer" si attiva ogni 70 millesimi di secondo:''</font>
 
    .Delay = 70
 
  End With
 
 
'''End'''
 
 
'''Public''' Sub Button2_Click()
 
 
<FONT color=gray>' ''Mette in "pausa" l'ascolto del file audio.''
 
' ''(Per continuare l'ascolto del file, si dovrà nuovamente attivare la proprietà ".Play"):</font>
 
  mp.<FONT color=#B22222>Pause</font>
 
 
'''End'''
 
 
'''Public''' Sub Button3_Click()
 
 
  RadioButton1.Value = False
 
 
<FONT color=gray>' ''Chiama la funzione per arrestare l'esecuzione del file audio:''</font>
 
  arresta()
 
 
'''End'''
 
 
 
'''Public''' Sub arresta()
 
 
<FONT color=gray>' ''Arresta l'ascolto del file audio:''</font>
 
  mp.<FONT color=#B22222>Stop</font>
 
 
  Timer1.Stop
 
 
<FONT color=gray>' ''Se è stato cliccato sul "RadioButton", verrà ripetuta l'esecuzione del file audio:''</font>
 
  If RadioButton1.Value Then
 
    mp.Position = 0
 
    suona()
 
  Else
 
<FONT color=gray>' ''Arresta l'ascolto del file audio:''</font>
 
    mp.Stop
 
  Endif
 
 
'''End'''
 
 
 
'''Public''' Sub Timer1_Timer()
 
 
<FONT color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati processati:''</font>
 
  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))
 
 
<FONT color=gray>' ''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"):''</font>
 
  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
 
 
 
'''Public''' Sub Form_Open()
 
 
  With Dial1
 
    .MinValue = 0
 
    .MaxValue = 100
 
    .Value = 50
 
  End With
 
 
 
<FONT color=gray>' ''Carica un file audio:''</font>
 
  mp.URL = Media.URL("''/percorso/mio/file/audio''")
 
 
'''End'''
 
 
 
 
'''Public''' Sub Button1_Click()
 
 
  suona()
 
 
'''End'''
 
 
 
'''Public''' Sub suona()
 
 
<FONT color=gray>' ''Avvia l'ascolto del file audio:''</font>
 
  mp.Play
 
 
 
  Do
 
<FONT color=gray>' ''Una brevissima pausa consente di agire sugli eventuali oggetti posti sul Form:''</font>
 
    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
 
 
 
  arresta()
 
 
 
'''End'''
 
 
 
'''Public''' Sub Button2_Click()
 
 
 
<FONT color=gray>' ''Mette in "pausa" l'ascolto del file audio.''
 
' ''(Per continuare l'ascolto del file, si dovrà nuovamente attivare la proprietà ".Play").''</font>
 
  mp.Pause
 
 
'''End'''
 
 
 
'''Public''' Sub Button3_Click()
 
 
 
  RadioButton1.Value = False
 
 
 
  mp.Position = mp.Duration + 1
 
 
 
'''End'''
 
 
 
'''Public''' Sub arresta()
 
 
 
<FONT color=gray>' ''Se è stato cliccato sul "RadioButton", verrà ripetuta l'esecuzione del file audio:''</font>
 
  If RadioButton1.Value Then
 
    mp.Position = 0
 
    suona()
 
  Else
 
<FONT color=gray>' ''Altrimenti arresta l'ascolto del file audio:''</font>
 
    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'':
 
'''Public''' Sub Main()
 
 
  Dim mp As MediaPlayer
 
 
 
  With mp = New MediaPlayer
 
    .URL = Media.URL("''/percorso/mio/file/audio''")
 
    .Play
 
  End With
 
 
 
  Do
 
<FONT color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati processati:''</font>
 
    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
 
 
 
  mp.Stop
 
 
 
'''End'''
 
 
 
 
 
 
 
==La proprietà ''.Duration''==
 
La proprietà ''.Duration'' restituisce un valore di tipo Float che rappresenta la durata del brano musicale espresso in secondi.
 
<BR>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.
 
<BR>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 ''<SPAN style="text-decoration:underline">Float</span>'' che rappresenta il volume corrente:
 
valore_di_tipo_Float = mp.Audio.<FONT color=#B22222>Volume</font>
 
 
 
nel secondo caso il volume è impostato mediante un valore di tipo ''<SPAN style="text-decoration:underline">Float</span>'', il cui ambito di valori impostabili va da 0.00 a 10.00:
 
mp.Audio.<FONT color=#B22222>Volume</font> = 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.<FONT color=#B22222>Mute</font> = 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 <FONT color=#B22222>As "mp"</font>
 
 
 
'''Public''' Sub Button1_Click()
 
 
  mp.URL = Media.URL("''/percorso/mio/file/audio''")
 
 
 
  mp.Play
 
 
 
'''End'''
 
 
 
<FONT color=gray>' ''Se ci sono "Tag" nel file audio, verrà sollevato il seguente evento:''</font>
 
'''Public''' Sub mp<FONT color=#B22222>_Tag</font>(tagLista As MediaTagList)
 
 
 
  Dim sTag As String
 
 
 
    For Each sTag In tagLista.Tags
 
<FONT color=gray>' ''Vediamo in console i Tag trovati del file audio:''</font>
 
      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 <FONT color=#B22222>MediaControl</font>
 
'''Private''' arrVis As <FONT color=#B22222>MediaControl[]</font>  <FONT color=gray>' ''Un array di variabili di tipo "MediaControl", ossia di vari PlugIn disponibili''</font>
 
 
 
 
'''Public''' Sub Form_Open()
 
 
  avviaPlugin()
 
 
  With mp
 
    .URL = Media.URL("''/percorso/del/file/audio''")
 
    .State = 4
 
    .State = 2
 
  End With
 
 
  Wait 0.1
 
 
<FONT color=gray>' ''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):''</font>
 
  uscitaVideo.SetWindow(drVid)
 
 
<FONT color=gray>' ''Esegue il brano:''</font>
 
  mp.Play()
 
 
 
'''End'''
 
 
 
'''Public''' Sub avviaPlugin()
 
 
<FONT color=gray>' ''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:''</font>
 
    uscitaVideo = New MediaControl(mp, "ximagesink")
 
 
 
<FONT color=gray>' ''Imposta il controllo di uscita video da usare:''</font>
 
    mp.Video.Output = uscitaVideo
 
 
 
 
    arrVis = New MediaControl[]
 
 
<FONT color=gray>' ''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:</font>
 
    aggiunVis("", "")
 
 
<FONT color=gray>' ''Ecco alcuni disponibili:''</font>
 
    aggiunVis("goom", "Goom")
 
<FONT color=gray>' ''Monoscopio è un plugin che consente di visualizzare una forma d'onda altamente stabilizzata di ingresso audio''</font>
 
    aggiunVis("monoscope", "Mono")
 
    aggiunVis("spacescope", "Space")
 
    aggiunVis("spectrascope", "Spectra")
 
    aggiunVis("synaescope", "Synae")
 
<FONT color=gray>' ''Oscilloscopio a forma d'onda semplice:''</font>
 
    aggiunVis("wavescope", "Wave")
 
 
<FONT color=gray>' ''Viene impostato inizialmente il "plugin" fra quelli sopra indicati:''</font>
 
    aggioVis(7)
 
 
'''End'''
 
 
 
'''Public''' Sub aggiunVis(tipoPlug As String, titolo As String)
 
 
 
  Dim hVis As MediaControl
 
 
<FONT color=gray>' ''La variabile "tipoPlug" contiene il tipo di plug'in...''</font>
 
    If tipoPlug Then hVis = New MediaControl(mp, tipoPlug)
 
 
 
<FONT color=gray>' ''...che viene aggiunta agli elementi della omogenea variabile array:''</font>
 
    arrVis.Add(hVis)
 
 
    Catch
 
      Error tipoPlug; ": "; Error.Text
 
 
 
'''End'''
 
 
 
'''Public''' Sub aggioVis(iVis as Byte)
 
 
  Dim hVis As MediaControl = arrVis[iVis - 1]
 
 
<FONT color=gray>' ''Imposta il plug-in da utilizzare:''</font>
 
    mp.Video.Visualisation = hVis
 
 
<FONT color=gray>' ''Anche qui viene impostata la "DrawingArea", ove mostrare gli effetti video:''</font>
 
    uscitaVideo.SetWindow(drVid)
 
 
 
'''End'''
 
 
 
'''Public''' Sub Button1_Click()
 
 
<FONT color=gray>' ''Modificando il valore della seguente variabile integer si modifica anche il tipo di visualizzazione''</font>
 
    aggioVis(Fix(Rnd(2, 8)))
 
 
'''End'''
 

Versione attuale delle 01:12, 5 ott 2020