Differenze tra le versioni di "Eseguire i file audio mediante la Classe ''MediaPlayer'' del componente gb.media"
Riga 12: | Riga 12: | ||
− | + | Public Sub Main() | |
Dim mp As MediaPlayer | Dim mp As MediaPlayer | ||
With mp = New MediaPlayer | With mp = New MediaPlayer | ||
− | .URL = Media.URL("<FONT Color= | + | .URL = Media.URL("<FONT Color=darkgreen>''/percorso/del/file/audio''</font>") |
.Play() | .Play() | ||
Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) | Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) | ||
Riga 32: | Riga 32: | ||
Quit | Quit | ||
− | + | End | |
+ | |||
− | + | Public Sub Application_Read() <FONT color=gray>' ''Premendo il tasto "Invio" della tastiera, si arresta il programma''</font> | |
bo = True | bo = True | ||
− | + | End | |
===Uso in un'applicazione grafica=== | ===Uso in un'applicazione grafica=== | ||
Riga 49: | Riga 50: | ||
− | + | Public Sub Form_Open() | |
ToggleButton2.Enabled = False | ToggleButton2.Enabled = False | ||
<FONT color=gray>' ''Carica un file audio:''</font> | <FONT color=gray>' ''Carica un file audio:''</font> | ||
− | mp.URL = Media.URL("<FONT color= | + | mp.URL = Media.URL("<FONT color=darkgreen>''/percorso/del/file/audio''</font>") |
+ | |||
+ | End | ||
− | |||
− | + | Public Sub ToggleButton1_Click() | |
If ToggleButton1.Value Then | If ToggleButton1.Value Then | ||
Riga 70: | Riga 72: | ||
Endif | Endif | ||
− | + | End | |
− | + | ||
+ | Public Sub Timer1_Timer() | ||
<FONT Color=gray>' ''Mostra in console la durata dell'audio e il tempo trascorso:''</font> | <FONT Color=gray>' ''Mostra in console la durata dell'audio e il tempo trascorso:''</font> | ||
Riga 81: | Riga 84: | ||
If mp.Position >= mp.Duration Then Arresta() | If mp.Position >= mp.Duration Then Arresta() | ||
− | + | End | |
− | + | ||
+ | Public Sub Esegue() | ||
<FONT Color=gray>' ''Avvia l'ascolto del file audio:''</font> | <FONT Color=gray>' ''Avvia l'ascolto del file audio:''</font> | ||
Riga 94: | Riga 98: | ||
End With | End With | ||
− | + | End | |
− | + | ||
+ | Public Sub Arresta() | ||
<FONT Color=gray>' ''Arresta l'ascolto del file audio:''</font> | <FONT Color=gray>' ''Arresta l'ascolto del file audio:''</font> | ||
Riga 104: | Riga 109: | ||
ToggleButton1.Value = False | ToggleButton1.Value = False | ||
− | + | End | |
− | + | ||
+ | Public Sub ToggleButton2_Click() | ||
<FONT Color=gray>' ''Mette in "pausa" l'ascolto del file audio.'' | <FONT Color=gray>' ''Mette in "pausa" l'ascolto del file audio.'' | ||
Riga 116: | Riga 122: | ||
Endif | Endif | ||
− | + | End | |
− | |||
In quest'altro esempio, simile al precedente, verrà utilizzato un ciclo al posto del ''Timer''. | In quest'altro esempio, simile al precedente, verrà utilizzato un ciclo al posto del ''Timer''. | ||
<BR>Si porrà anche un Controllo ''Slider'' per poter modificare il volume. | <BR>Si porrà anche un Controllo ''Slider'' per poter modificare il volume. | ||
Riga 123: | Riga 128: | ||
− | + | Public Sub Form_Open() | |
With Slider1 | With Slider1 | ||
Riga 136: | Riga 141: | ||
mp.URL = Media.URL("<FONT color=gray>''/percorso/del/file/audio''</font>") | mp.URL = Media.URL("<FONT color=gray>''/percorso/del/file/audio''</font>") | ||
− | + | End | |
− | + | ||
+ | Public Sub ToggleButton1_Click() | ||
If ToggleButton1.Value Then | If ToggleButton1.Value Then | ||
Riga 150: | Riga 156: | ||
Endif | Endif | ||
− | + | End | |
+ | |||
− | + | Public Sub Esegue() | |
<FONT color=gray>' ''Avvia l'ascolto del file audio:''</font> | <FONT color=gray>' ''Avvia l'ascolto del file audio:''</font> | ||
Riga 166: | Riga 173: | ||
Arresta() | Arresta() | ||
− | + | End | |
+ | |||
− | + | Public Sub Arresta() | |
<FONT color=gray>' ''Arresta l'ascolto del file audio:''</font> | <FONT color=gray>' ''Arresta l'ascolto del file audio:''</font> | ||
Riga 176: | Riga 184: | ||
ToggleButton1.Value = False | ToggleButton1.Value = False | ||
− | + | End | |
− | + | ||
+ | Public Sub ToggleButton2_Click() | ||
<FONT color=gray>' ''Mette in "pausa" l'ascolto del file audio.'' | <FONT color=gray>' ''Mette in "pausa" l'ascolto del file audio.'' | ||
Riga 188: | Riga 197: | ||
Endif | Endif | ||
− | + | End | |
− | + | ||
+ | Public Sub Slider1_Change() | ||
mp.Audio.Volume = Slider1.Value / 100 | mp.Audio.Volume = Slider1.Value / 100 | ||
− | + | End | |
− | ==La Proprietà | + | |
+ | ===Eseguire un file dal web== | ||
+ | Per eseguire un file audio dal web, l'indirizzo sarà assegnato senza l'uso del Metodo "Media.URL()" (necessario, invece, per i file contenuti in una memoria solida. | ||
+ | |||
+ | Mostriamo di seguito un esempio pratico in ambiente grafico: | ||
+ | Private mp As New MediaPlayer | ||
+ | |||
+ | |||
+ | Public Sub ToggleButton1_Click() | ||
+ | |||
+ | If ToggleButton1.Value Then | ||
+ | TextArea1.Clear | ||
+ | With mp = New MediaPlayer As "MediaPlayer1" | ||
+ | .URL = "https://samples-files.com/samples/Audio/mp3/sample-file-1.mp3" | ||
+ | .Play | ||
+ | End With | ||
+ | While mp.Pos < 0.1 | ||
+ | Wait 0.01 | ||
+ | Wend | ||
+ | While mp.State == Media.Playing | ||
+ | Me.Title = Str(Time(0, 0, 0, mp.Pos * 1000)) | ||
+ | Wait 0.01 | ||
+ | Wend | ||
+ | Else | ||
+ | mp.Stop | ||
+ | mp.Close | ||
+ | Endif | ||
+ | |||
+ | End | ||
+ | |||
+ | ==La Proprietà ".Duration"== | ||
La Proprietà ".Duration" restituisce un valore di tipo Float che rappresenta la durata del brano musicale espresso in secondi. | 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 <SPAN Style="text-decoration:underline">solo successivamente all'attivazione del Metodo ".Play"</span>. | <BR>Poiché detta proprietà ritorna più precisamente la durata dei dati processati, essa potrà essere utilizzabile <SPAN Style="text-decoration:underline">solo successivamente all'attivazione del Metodo ".Play"</span>. | ||
<BR>Va rilevato che per taluni file audio di formato MP3 ''MediapLayer'' ha difficoltà a restituire la durata del file e la Proprietà ".Duration" ritornerà il valore 0. | <BR>Va rilevato che per taluni file audio di formato MP3 ''MediapLayer'' ha difficoltà a restituire la durata del file e la Proprietà ".Duration" ritornerà il valore 0. | ||
<BR>Di seguito mostriamo un esempio di uso della Proprietà ".Duration": | <BR>Di seguito mostriamo un esempio di uso della Proprietà ".Duration": | ||
− | + | Public Sub Main() | |
Dim mp As MediaPlayer | Dim mp As MediaPlayer | ||
With mp = New MediaPlayer | With mp = New MediaPlayer | ||
− | .URL = Media.URL("<FONT Color= | + | .URL = Media.URL("<FONT Color=darkgreen>''/percorso/del/file/audio''</font>") |
.Play | .Play | ||
Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) | Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) | ||
Riga 217: | Riga 257: | ||
End With | End With | ||
− | + | End | |
oppure più semplicemente: | oppure più semplicemente: | ||
...... | ...... | ||
Riga 226: | Riga 266: | ||
.Close | .Close | ||
End With | End With | ||
+ | In entrambe le soluzioni, qualora il valore della Prorpietà ".Duration" venga restituito in considerevole ritardo, il processo supererà il ciclo "Repeat...Until" del codice, qui appena mostrato. Per ovviare a questo problema, si potrà porre - immediatamente dopo il Metodo "mp.Play() - un ciclo preventio che consenta di attendere che il valore, restituito dalla Prorpietà ".Duration", sia superiore a 0.0 (zero): | ||
+ | While mp.Duration < 0.1 | ||
+ | Wait 0.01 | ||
+ | Wend | ||
− | ==La Proprietà | + | ==La Proprietà ".Position"== |
− | La Proprietà | + | 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. | <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. | ||
Riga 253: | Riga 297: | ||
− | + | Public Sub Button1_Click() | |
Dim mp As MediaPlayer | Dim mp As MediaPlayer | ||
Riga 271: | Riga 315: | ||
Write "\n\e[0mEsecuzione terminata !" | Write "\n\e[0mEsecuzione terminata !" | ||
− | + | End | |
+ | |||
− | + | Public Sub MediaPlayer1<FONT Color=#B22222>_End()</font> | |
bo = True | bo = True | ||
− | + | End | |
==Estrarre i ''Tag'' da un file audio== | ==Estrarre i ''Tag'' da un file audio== | ||
Per estrarre i ''Tag'' da un file audio si utilizzerà l'evento "_Tag()" della Classe ''MediaPlayer''. | Per estrarre i ''Tag'' da un file audio si utilizzerà l'evento "_Tag()" della Classe ''MediaPlayer''. | ||
<BR>L'evento avrà come parametro una variabile del tipo ''MediaTagList'', che conterrà la lista dei ''Tag'' trovati. | <BR>L'evento avrà come parametro una variabile del tipo ''MediaTagList'', che conterrà la lista dei ''Tag'' trovati. | ||
− | + | Public Sub Button1_Click() | |
Dim mp As MediaPlayer | Dim mp As MediaPlayer | ||
Riga 289: | Riga 334: | ||
.URL = Media.URL("<FONT color=gray>''/percorso/del/file/audio''</font>") | .URL = Media.URL("<FONT color=gray>''/percorso/del/file/audio''</font>") | ||
.Play | .Play | ||
+ | While .Duration < 0.1 | ||
+ | 0.01 | ||
+ | Wend | ||
Wait .Duration | Wait .Duration | ||
.Stop | .Stop | ||
Riga 294: | Riga 342: | ||
End With | End With | ||
− | + | End | |
<FONT color=gray>' ''Se ci sono "Tag" nel file audio, verrà sollevato il seguente evento:''</font> | <FONT color=gray>' ''Se ci sono "Tag" nel file audio, verrà sollevato il seguente evento:''</font> | ||
− | + | Public Sub MediaPlayer1<FONT color=#B22222><B>_Tag</b></font>(tagLista As <FONT color=#B22222>MediaTagList</font>) | |
Dim tag As String | Dim tag As String | ||
Riga 309: | Riga 357: | ||
Next | Next | ||
− | + | End | |
V'è da evidenziare che l'evento "_Tag()" sarà sollevato solo con l'attivazione del Metodo ".Play". | V'è da evidenziare che l'evento "_Tag()" sarà sollevato solo con l'attivazione del Metodo ".Play". | ||
+ | |||
+ | ===Mostrare i Tag di un file audio presente nel web=== | ||
+ | Mostriamo un caso pratico: | ||
+ | Private mp As MediaPlayer | ||
+ | |||
+ | |||
+ | Public Sub ToggleButton1_Click() | ||
+ | |||
+ | If ToggleButton1.Value Then | ||
+ | TextArea1.Clear | ||
+ | With mp = New MediaPlayer As "MediaPlayer1" | ||
+ | .URL = "https://samples-files.com/samples/Audio/mp3/sample-file-1.mp3" | ||
+ | .Play | ||
+ | End With | ||
+ | While mp.Pos < 0.1 | ||
+ | Wait 0.01 | ||
+ | Wend | ||
+ | While mp.State == Media.Playing | ||
+ | Me.Title = Str(Time(0, 0, 0, mp.Pos * 1000)) | ||
+ | Wait 0.01 | ||
+ | Wend | ||
+ | Else | ||
+ | mp.Stop | ||
+ | mp.Close | ||
+ | Endif | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub MediaPlayer1_Tag(tagList As MediaTagList) | ||
+ | |||
+ | Dim tag As String | ||
+ | |||
+ | For Each tag In tagList.Tags | ||
+ | TextArea1.Text &= tag & " -> " & tagList[tag] & gb.NewLine | ||
+ | Next | ||
+ | |||
+ | End | ||
==Gli effetti video con i ''plug-in''== | ==Gli effetti video con i ''plug-in''== | ||
Riga 322: | Riga 408: | ||
− | + | Public Sub Form_Open() | |
Dim da As DrawingArea | Dim da As DrawingArea | ||
− | + | With da = New DrawingArea(Me) | |
− | + | .X = 10 | |
− | + | .Y = 10 | |
− | + | .W = 300 | |
− | + | .H = 300 | |
− | + | .Background = Color.Black | |
− | + | End With | |
− | + | mp.URL = Media.URL("<FONT Color=gray>''/percorso/del/file/audio''</font>") | |
− | + | AvviaPlugin(da) | |
− | + | End | |
+ | |||
+ | |||
+ | Private Procedure AvviaPlugin(drar As DrawingArea) | ||
− | |||
− | |||
Dim uscitaVideo, plugVis As MediaControl | Dim uscitaVideo, plugVis As MediaControl | ||
Dim b As Byte | Dim b As Byte | ||
Riga 349: | Riga 436: | ||
<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> | <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>' ''Si dice al MediaControl di mostrare il proprio output (gli effetti video) in uno specifico controllo GUI, solitamente una DrawingArea:''</font> | <FONT Color=gray>' ''Si dice al MediaControl di mostrare il proprio output (gli effetti video) in uno specifico controllo GUI, solitamente una DrawingArea:''</font> | ||
− | + | mp.SetWindow(drar) | |
<FONT Color=gray>' ''Imposta il controllo di uscita video da usare:''</font> | <FONT Color=gray>' ''Imposta il controllo di uscita video da usare:''</font> | ||
− | + | mp.Video.Output = uscitaVideo | |
<FONT Color=gray>' ''Un array di variabili di tipo "MediaControl", ossia di vari PlugIn disponibili:''</font> | <FONT Color=gray>' ''Un array di variabili di tipo "MediaControl", ossia di vari PlugIn disponibili:''</font> | ||
− | + | arrplugin = New MediaControl[] | |
− | + | For b = 0 To 5 | |
− | + | plugVis = New MediaControl(mp, tipoPlug[b]) | |
− | + | arrplugin.Push(plugVis) | |
− | + | Next | |
− | + | ||
<FONT Color=gray>' ''Imposta il plug-in da utilizzare (ad esempio il 6° fra quelli contenuti dal vettore "arrplugin"):''</font> | <FONT Color=gray>' ''Imposta il plug-in da utilizzare (ad esempio il 6° fra quelli contenuti dal vettore "arrplugin"):''</font> | ||
− | + | mp.Video.Visualisation = arrplugin[5] | |
− | + | End | |
+ | |||
+ | |||
+ | Public Sub Form_Activate() | ||
− | |||
− | |||
<FONT Color=gray>' ''Esegue il file audio:''</font> | <FONT Color=gray>' ''Esegue il file audio:''</font> | ||
− | + | mp.Play() | |
− | + | End | |
==Interfacciare la Classe ''MediaPlayer'' con il plugin "''jackaudiosink''" di ''GStreamer'' per eseguire i file audio== | ==Interfacciare la Classe ''MediaPlayer'' con il plugin "''jackaudiosink''" di ''GStreamer'' per eseguire i file audio== | ||
Riga 385: | Riga 473: | ||
Mostriamo un semplice ed essenziale esempio di esecuzione di un file audio in un'applicazione ''a riga di comando'': | Mostriamo un semplice ed essenziale esempio di esecuzione di un file audio in un'applicazione ''a riga di comando'': | ||
− | + | Public Sub Main() | |
Dim mp As MediaPlayer | Dim mp As MediaPlayer | ||
Riga 398: | Riga 486: | ||
End With | End With | ||
− | + | End | |
Versione delle 15:29, 8 nov 2023
La classe MediaPlayer del componente gb.media consente di gestire uno o più file audio anche contemporaneamente.
Gli elementi essenziali per eseguire un file audio con la Classe MediaPlayer sono:
- la Proprietà ".Url" per caricare il file (se il file è memorizzato su dispositivo di memoria, allora il suo percorso andrà passato mediante il Metodo ".Url" della Classe statica "Media"; se il file è eseguito da un indirizzo web, allora sarà passato direttamente l'indirizzo web);
- il Metodo ".Play()" per avviare l'esecuzione del file audio;
- la Proprietà ".Duration" per far eseguire il file audio per l'intera sua durata;
- il Metodo ".Close()" per chiudere il mediaplayer.
Indice
- 1 Uso in un'applicazione a riga di comando
- 2 Uso in un'applicazione grafica
- 3 =Eseguire un file dal web
- 4 La Proprietà ".Duration"
- 5 La Proprietà ".Position"
- 6 Modificare il Volume
- 7 Annullare l'audio immediatamente
- 8 L'evento _AboutToFinish()
- 9 L'evento _End()
- 10 Estrarre i Tag da un file audio
- 11 Gli effetti video con i plug-in
- 12 Interfacciare la Classe MediaPlayer con il plugin "jackaudiosink" di GStreamer per eseguire i file audio
- 13 Note
Uso 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() Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) Repeat ' Mostra in console la posizione, espressa in secondi, all'interno dei dati processati: Write "\r\e[0mTempo trascorso: \e[1m\e[31m" & Str(Time(0, 0, 0, .Position * 1000)) Wait 0.01 Until (mp.Position >= mp.Duration) Or bo .Stop .Close End With ' Avendo utilizzato l'Evento "Application_Read()", è necessario invocare l'istruzione "Quit" per terminare il programma: Quit End Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera, si arresta il programma bo = True End
Uso in un'applicazione grafica
Vediamo un semplice codice, con il quale sarà possibile ascoltare, porre in pausa e terminare un file audio in un'applicazione grafica.
Porremo sul Form del progetto:
- un ToggleButton per avviare ed arrestare l'esecuzione del file audio;
- un ToggleButton per porre in pausa l'esecuzione del file audio;
- un Timer che ci consentirà di calcolare il tempo trascorso;
Private mp As New MediaPlayer Public Sub Form_Open() ToggleButton2.Enabled = False ' Carica un file audio: mp.URL = Media.URL("/percorso/del/file/audio") End Public Sub ToggleButton1_Click() If ToggleButton1.Value Then ToggleButton2.Enabled = True Esegue() Else ' Chiama la funzione per arrestare l'esecuzione del file audio: Arresta() ToggleButton2.Value = False ToggleButton2.Enabled = False Endif End Public Sub Timer1_Timer() ' Mostra in console la durata dell'audio e il tempo trascorso: Write "\rDurata: " & Time(0, 0, 0, mp.Duration * 1000) & " - Tempo trascorso: " & Time(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: If mp.Position >= mp.Duration Then Arresta() End Public Sub Esegue() ' Avvia l'ascolto del file audio: mp.Play With Timer1 ' Il "Timer" si attiva ogni 70 millesimi di secondo: .Delay = 70 .Start End With End Public Sub Arresta() ' Arresta l'ascolto del file audio: mp.Stop mp.Close Timer1.Stop ToggleButton1.Value = False End Public Sub ToggleButton2_Click() ' Mette in "pausa" l'ascolto del file audio. ' (Per continuare l'ascolto del file, si dovrà nuovamente attivare la Proprietà ".Play"): If ToggleButton2.Value Then mp.Pause Else If ToggleButton1.Value Then Esegue() Endif End
In quest'altro esempio, simile al precedente, verrà utilizzato un ciclo al posto del Timer.
Si porrà anche un Controllo Slider per poter modificare il volume.
Private mp As New MediaPlayer Public Sub Form_Open() With Slider1 .MinValue = 0 .MaxValue = 100 .Value = 50 End With ToggleButton2.Enabled = False ' Carica un file audio: mp.URL = Media.URL("/percorso/del/file/audio") End Public Sub ToggleButton1_Click() If ToggleButton1.Value Then ToggleButton2.Enabled = True Esegue() Else ' Chiama la funzione per arrestare l'esecuzione del file audio: Arresta() ToggleButton2.Value = False ToggleButton2.Enabled = False Endif End Public Sub Esegue() ' Avvia l'ascolto del file audio: mp.Play Repeat ' Una brevissima pausa consente di agire sugli eventuali "Controlli" posti sul Form: Wait 0.01 Write "\rDurata: " & Time(0, 0, 0, mp.Duration * 1000) & " - Tempo trascorso: " & Time(0, 0, 0, mp.Position * 1000) Until (mp.Position >= mp.Duration) Arresta() End Public Sub Arresta() ' Arresta l'ascolto del file audio: mp.Stop mp.Close Timer1.Stop ToggleButton1.Value = False End Public Sub ToggleButton2_Click() ' Mette in "pausa" l'ascolto del file audio. ' (Per continuare l'ascolto del file, si dovrà nuovamente attivare la Proprietà ".Play"): If ToggleButton2.Value Then mp.Pause Else If ToggleButton1.Value Then Esegue() Endif End Public Sub Slider1_Change() mp.Audio.Volume = Slider1.Value / 100 End
=Eseguire un file dal web
Per eseguire un file audio dal web, l'indirizzo sarà assegnato senza l'uso del Metodo "Media.URL()" (necessario, invece, per i file contenuti in una memoria solida.
Mostriamo di seguito un esempio pratico in ambiente grafico:
Private mp As New MediaPlayer Public Sub ToggleButton1_Click() If ToggleButton1.Value Then TextArea1.Clear With mp = New MediaPlayer As "MediaPlayer1" .URL = "https://samples-files.com/samples/Audio/mp3/sample-file-1.mp3" .Play End With While mp.Pos < 0.1 Wait 0.01 Wend While mp.State == Media.Playing Me.Title = Str(Time(0, 0, 0, mp.Pos * 1000)) Wait 0.01 Wend Else mp.Stop mp.Close Endif 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 del Metodo ".Play".
Va rilevato che per taluni file audio di formato MP3 MediapLayer ha difficoltà a restituire la durata del file e la Proprietà ".Duration" ritornerà il valore 0.
Di seguito mostriamo un esempio di uso della Proprietà ".Duration":
Public Sub Main() Dim mp As MediaPlayer With mp = New MediaPlayer .URL = Media.URL("/percorso/del/file/audio") .Play Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) Repeat Wait 0.01 Write "\r \e[31m" & Str(Time(0, 0, 0, .pos * 1000)) Until .Pos >= .Duration .Stop .Close End With End
oppure più semplicemente:
...... .Play Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) Wait .Duration .Stop .Close End With
In entrambe le soluzioni, qualora il valore della Prorpietà ".Duration" venga restituito in considerevole ritardo, il processo supererà il ciclo "Repeat...Until" del codice, qui appena mostrato. Per ovviare a questo problema, si potrà porre - immediatamente dopo il Metodo "mp.Play() - un ciclo preventio che consenta di attendere che il valore, restituito dalla Prorpietà ".Duration", sia superiore a 0.0 (zero):
While mp.Duration < 0.1 Wait 0.01 Wend
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 l'esecuzione del file audio è terminata.
Esempio:
Private bo As Boolean Public Sub Button1_Click() Dim mp As MediaPlayer With mp = New MediaPlayer As "MediaPlayer1" .URL = Media.URL("/percorso/del/file/audio") .Play Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, .Duration * 1000)) Repeat Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, .Position * 1000)) Wait 0.01 Until bo .Stop .Close End With Write "\n\e[0mEsecuzione terminata !" End Public Sub MediaPlayer1_End() bo = True End
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.
Public Sub Button1_Click() Dim mp As MediaPlayer With mp = New MediaPlayer As "MediaPlayer1" .URL = Media.URL("/percorso/del/file/audio") .Play While .Duration < 0.1 0.01 Wend Wait .Duration .Stop .Close End With End ' Se ci sono "Tag" nel file audio, verrà sollevato il seguente evento: Public Sub MediaPlayer1_Tag(tagLista As MediaTagList) Dim tag As String TextArea1.Clear For Each tag In tagLista.Tags ' Vediamo nella "TextArea" i Tag trovati del file audio: TextArea1.Text &= tag & " -> " & tagLista[tag] & gb.NewLine Next End
V'è da evidenziare che l'evento "_Tag()" sarà sollevato solo con l'attivazione del Metodo ".Play".
Mostrare i Tag di un file audio presente nel web
Mostriamo un caso pratico:
Private mp As MediaPlayer Public Sub ToggleButton1_Click() If ToggleButton1.Value Then TextArea1.Clear With mp = New MediaPlayer As "MediaPlayer1" .URL = "https://samples-files.com/samples/Audio/mp3/sample-file-1.mp3" .Play End With While mp.Pos < 0.1 Wait 0.01 Wend While mp.State == Media.Playing Me.Title = Str(Time(0, 0, 0, mp.Pos * 1000)) Wait 0.01 Wend Else mp.Stop mp.Close Endif End Public Sub MediaPlayer1_Tag(tagList As MediaTagList) Dim tag As String For Each tag In tagList.Tags TextArea1.Text &= tag & " -> " & tagList[tag] & gb.NewLine Next End
Gli effetti video con i plug-in
E' possibile ottenere simpatici effetti video utilizzando i plug-in resi disposibili da GStreamer.
Gli effetti video disponibili sono i seguenti:
"goom", "monoscope", "spacescope", "spectrascope", "synaescope", "wavescope"
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 effetti video con i plug-In (si inserirà anche una DrawingArea sul Form):
Private mp As New MediaPlayer Public Sub Form_Open() Dim da As DrawingArea With da = New DrawingArea(Me) .X = 10 .Y = 10 .W = 300 .H = 300 .Background = Color.Black End With mp.URL = Media.URL("/percorso/del/file/audio") AvviaPlugin(da) End Private Procedure AvviaPlugin(drar As DrawingArea) Dim uscitaVideo, plugVis As MediaControl Dim b As Byte Dim tipoPlug As String[] = ["goom", "monoscope", "spacescope", "spectrascope", "synaescope", "wavescope"] Dim arrplugin As MediaControl[] ' 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") ' Si dice al MediaControl di mostrare il proprio output (gli effetti video) in uno specifico controllo GUI, solitamente una DrawingArea: mp.SetWindow(drar) ' Imposta il controllo di uscita video da usare: mp.Video.Output = uscitaVideo ' Un array di variabili di tipo "MediaControl", ossia di vari PlugIn disponibili: arrplugin = New MediaControl[] For b = 0 To 5 plugVis = New MediaControl(mp, tipoPlug[b]) arrplugin.Push(plugVis) Next ' Imposta il plug-in da utilizzare (ad esempio il 6° fra quelli contenuti dal vettore "arrplugin"): mp.Video.Visualisation = arrplugin[5] End Public Sub Form_Activate() ' Esegue il file audio: mp.Play() End
Interfacciare la Classe MediaPlayer con il plugin "jackaudiosink" di GStreamer per eseguire i file audio
Per eseguire i file audio con la Classe MediaPlayer è 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". [Nota 1]
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 ed essenziale esempio di esecuzione di un file audio in un'applicazione a riga di comando:
Public Sub Main() Dim mp As MediaPlayer With mp = New MediaPlayer .URL = Media.URL("/percorso/del/file/audio") .Audio.Output = New MediaControl(mp, "jackaudiosink") .Play Wait .Duration .Stop .Close End With End
Note
[1] La stesura di paragrafo è stata possibile anche grazie al fondamentale apporto e studio del membro allegfede del forum gambas-it.org .