Differenze tra le versioni di "Eseguire i file audio mediante la Classe ''MediaPlayer'' del componente gb.media"
(43 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 2: | Riga 2: | ||
Gli elementi essenziali per eseguire un file audio con la Classe ''MediaPlayer'' sono: | Gli elementi essenziali per eseguire un file audio con la Classe ''MediaPlayer'' sono: | ||
− | * la Proprietà ". | + | * 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 l'indirizzo web sarà passato direttamente alla Proprietà ".URL"); |
* il Metodo ".Play()" per avviare l'esecuzione del file audio; | * il Metodo ".Play()" per avviare l'esecuzione del file audio; | ||
− | |||
* il Metodo ".Close()" per chiudere il mediaplayer. | * il Metodo ".Close()" per chiudere il mediaplayer. | ||
− | ===Uso | + | ===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 | |
− | |||
− | |||
− | |||
− | Private | ||
− | + | Public Sub Main() | |
− | + | Dim mp As MediaPlayer | |
+ | |||
+ | With mp = New MediaPlayer | ||
+ | .URL = Media.URL("<FONT Color=darkgreen>''/percorso/del/file/audio''</font>") | ||
+ | .Play() | ||
+ | While mp.Duration < 0.1 | ||
+ | Wait 0.01 | ||
+ | Wend | ||
+ | Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) | ||
+ | Repeat | ||
+ | <FONT color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati processati:''</font> | ||
+ | Write "\r\e[0mTempo trascorso: \e[1m\e[31m" & Str(Time(0, 0, 0, .Position * 1000)) | ||
+ | Wait 0.1 | ||
+ | Until (mp.Position >= mp.Duration) Or bo | ||
+ | .Stop | ||
+ | .Close | ||
+ | End With | ||
− | <FONT color=gray>' '' | + | <FONT color=gray>' ''Avendo utilizzato l'Evento "Application_Read()", è necessario invocare l'istruzione "Quit" per terminare il programma:''</font> |
− | + | Quit | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | End | |
− | |||
− | <FONT | + | Public Sub Application_Read() <FONT color=gray>' ''Premendo il tasto "Invio" della tastiera, si arresta il programma''</font> |
− | |||
− | |||
− | + | bo = True | |
− | + | ||
+ | End | ||
+ | Se non si ha interesse ad avere il valore del tempo trascorso dall'inizio dell'esecuzione del file audio, allora il ciclo "Repeat...Until", presente nel codice sopra mostrato, potrà essere sostituito dalla riga: | ||
+ | Wait .Duration | ||
+ | |||
+ | ===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. | ||
+ | Private mp As <FONT color=#B22222>MediaPlayer</font> | ||
− | |||
− | + | Public Sub Form_Open() | |
− | <FONT | + | With mp = New MediaPlayer As "MediaPlayer1" |
− | + | <FONT color=gray>' ''Carica un file audio:''</font> | |
− | + | .URL = Media.URL("<FONT color=darkgreen>''/percorso/del/file/audio''</font>") | |
− | |||
− | |||
− | |||
− | |||
End With | End With | ||
− | + | ToggleButton1.Text = "Avvia" | |
− | + | ToggleButton2.Enabled = False | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ToggleButton1. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
With Slider1 | With Slider1 | ||
Riga 98: | Riga 66: | ||
End With | End With | ||
− | + | End | |
− | |||
− | |||
− | + | Public Sub ToggleButton1_Click() | |
− | |||
− | |||
If ToggleButton1.Value Then | If ToggleButton1.Value Then | ||
+ | ToggleButton1.Text = "Stop" | ||
ToggleButton2.Enabled = True | ToggleButton2.Enabled = True | ||
+ | ToggleButton2.Text = "Pausa" | ||
Esegue() | Esegue() | ||
Else | Else | ||
<FONT color=gray>' ''Chiama la funzione per arrestare l'esecuzione del file audio:''</font> | <FONT color=gray>' ''Chiama la funzione per arrestare l'esecuzione del file audio:''</font> | ||
− | |||
ToggleButton2.Value = False | ToggleButton2.Value = False | ||
ToggleButton2.Enabled = False | ToggleButton2.Enabled = False | ||
+ | Arresta() | ||
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> | ||
mp.Play | mp.Play | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | End | |
− | |||
− | + | Public Sub Arresta() | |
<FONT color=gray>' ''Arresta l'ascolto del file audio:''</font> | <FONT color=gray>' ''Arresta l'ascolto del file audio:''</font> | ||
mp.Stop | mp.Stop | ||
mp.Close | mp.Close | ||
− | + | ToggleButton1.Text = "Avvia" | |
+ | ToggleButton2.Text = Null | ||
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 151: | Riga 112: | ||
If ToggleButton2.Value Then | If ToggleButton2.Value Then | ||
mp.Pause | mp.Pause | ||
+ | ToggleButton2.Text = "Continua" | ||
Else | Else | ||
− | If ToggleButton1.Value Then Esegue() | + | If ToggleButton1.Value Then |
+ | ToggleButton2.Text = "Pausa" | ||
+ | Esegue() | ||
+ | Endif | ||
Endif | Endif | ||
− | + | End | |
− | + | ||
+ | Public Sub Slider1_Change() | ||
mp.Audio.Volume = Slider1.Value / 100 | mp.Audio.Volume = Slider1.Value / 100 | ||
− | + | End | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Public Sub MediaPlayer1_Position() | |
− | + | Me.Title = Str(Time(0, 0, 0, mp.Pos * 1000)) & | |
− | + | " Vol. " & Slider1.Value | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | End | |
− | |||
− | |||
− | + | Public Sub MediaPlayer1_End() | |
− | + | ToggleButton1.Value = False | |
− | + | End | |
+ | |||
+ | ===Eseguire un file dal web=== | ||
+ | Per eseguire un file audio dal web, l'indirizzo sarà assegnato <SPAN Style="text-decoration:underline">senza</span> l'uso del Metodo "Media.URL()". | ||
+ | <BR>Pertanto, riprendendo il codice sopra mostrato, la riga, ove sarà assegnato l'indirizzo web del file audio alla Proprietà ".URL" della Classe ''MediaPlayer'', sarà la seguente: | ||
+ | .URL = "<FONT Color=darkgreen>''indirizzo/web/del/file/audio''</font>" | ||
+ | Esempio pratico: | ||
+ | .URL = "https://samples-files.com/samples/Audio/mp3/sample-file-1.mp3" | ||
− | ==La | + | ==La Proprietà ".Duration"== |
− | La | + | 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>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 | ||
+ | While mp.Duration < 0.1 | ||
+ | Wait 0.01 | ||
+ | Wend | ||
Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) | Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) | ||
Repeat | Repeat | ||
Riga 217: | Riga 176: | ||
End With | End With | ||
− | + | End | |
oppure più semplicemente: | oppure più semplicemente: | ||
...... | ...... | ||
.Play | .Play | ||
+ | While mp.Duration < 0.1 | ||
+ | Wait 0.01 | ||
+ | Wend | ||
Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) | Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) | ||
Wait .Duration | Wait .Duration | ||
Riga 227: | Riga 189: | ||
End With | End With | ||
− | + | ==La Proprietà ".Position"== | |
− | ==La | + | La Proprietà ".Position" restituisce un valore di tipo Float che rappresenta la posizione, espressa in secondi all'interno dei dati processati. |
− | La | ||
<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. | ||
− | |||
==Modificare il ''Volume''== | ==Modificare il ''Volume''== | ||
Riga 241: | Riga 201: | ||
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: | 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 | mp.Audio.<FONT color=#B22222>Volume</font> = valore_di_tipo_Float | ||
− | |||
==Annullare l'audio immediatamente== | ==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''. | 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 | mp.Audio.<FONT color=#B22222>Mute</font> = True | ||
− | |||
==L'evento _AboutToFinish()== | ==L'evento _AboutToFinish()== | ||
− | L' | + | 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. | ||
− | == | + | =Estrarre i ''Tag'' da un file audio= |
− | L'evento " | + | 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>Da evidenziare che l'evento "_Tag()" sarà sollevato solo con l'attivazione del Metodo ".Play". | ||
− | + | Mostriamo un esempio pratico: | |
− | + | Private mp As MediaPlayer | |
− | + | Private Meta As New Collection | |
+ | Private ss As New String[] | ||
+ | |||
− | + | Public Sub ToggleButton1_Click() | |
+ | |||
+ | If ToggleButton1.Value Then | ||
+ | TextArea1.Clear | ||
+ | With mp = New MediaPlayer As "MediaPlayer1" | ||
+ | .URL = Media.URL("<FONT Color=darkgreen>''/percorso/del/file/audio''</font>") | ||
+ | .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.1 | ||
+ | Wend | ||
+ | mp.Close | ||
+ | Else | ||
+ | mp.Stop | ||
+ | mp.Close | ||
+ | Endif | ||
− | + | End | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Public Sub MediaPlayer1_Tag(tagList As MediaTagList) | |
− | + | For Each tag As String In tagList.Tags | |
+ | If Not Meta.Exist(tag) Then | ||
+ | Meta[tag] = tagList[tag] | ||
+ | ss.Push(tag) | ||
+ | ss.Push(tagList[tag]) | ||
+ | Else | ||
+ | ss[ss.Find(tag) + 1] = tagList[tag] | ||
+ | Endif | ||
+ | Next | ||
− | + | TextArea1.Clear | |
− | + | For c As Short = 0 To ss.Max Step 2 | |
− | . | + | TextArea1.Text &= ss[c] & ": " & ss[c + 1] & gb.NewLine |
− | . | + | Next |
− | |||
− | |||
− | + | End | |
+ | Il seguente codice è più elaborato e prevede l'uso degli Eventi "_Position()" e "_End()" della Classe ''MediaPlayer'' al posto del ciclo visto prima. | ||
+ | Private mp As MediaPlayer | ||
+ | Private Meta As New Collection | ||
+ | Private ss As New String[] | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Public Sub ToggleButton1_Click() | |
− | With mp = New MediaPlayer As "MediaPlayer1" | + | If ToggleButton1.Value Then |
− | + | TextArea1.Clear | |
− | + | With mp = New MediaPlayer As "MediaPlayer1" | |
− | + | .URL = Media.URL("<FONT Color=darkgreen>''/percorso/del/file/audio''</font>") | |
− | .Stop | + | .Play |
− | .Close | + | End With |
− | + | Else | |
+ | mp.Stop | ||
+ | mp.Close | ||
+ | Endif | ||
− | + | 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>(tagList As <FONT color=#B22222>MediaTagList</font>) | |
− | + | For Each tag As String In tagList.Tags | |
+ | If Not Meta.Exist(tag) Then | ||
+ | Meta[tag] = tagList[tag] | ||
+ | ss.Push(tag) | ||
+ | ss.Push(tagList[tag]) | ||
+ | Else | ||
+ | ss[ss.Find(tag) + 1] = tagList[tag] | ||
+ | Endif | ||
+ | Next | ||
+ | |||
+ | TextArea1.Clear | ||
+ | For c As Short = 0 To ss.Max Step 2 | ||
+ | TextArea1.Text &= ss[c] & ": " & ss[c + 1] & gb.NewLine | ||
+ | Next | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub MediaPlayer1_Position() | ||
+ | |||
+ | Me.Title = Str(Time(0, 0, 0, mp.Pos * 1000)) | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub MediaPlayer1_End() | ||
+ | |||
+ | mp.Close | ||
+ | ToggleButton1.Value = False | ||
+ | End | ||
+ | |||
+ | ===Mostrare i Tag di un file audio presente nel web=== | ||
+ | Mostriamo un caso pratico: | ||
+ | Private mp As MediaPlayer | ||
+ | Private Meta As New Collection | ||
+ | Private ss As New String[] | ||
+ | |||
+ | |||
+ | Public Sub ToggleButton1_Click() | ||
+ | |||
+ | If ToggleButton1.Value Then | ||
+ | TextArea1.Clear | ||
+ | With mp = New MediaPlayer As "MediaPlayer1" | ||
+ | <FONT color=gray>' '''''Nel caso di un indirizzo web, non si deve usare il Metodo "Media.URL():'''''</font> | ||
+ | .URL = "https://samples-files.com/samples/Audio/mp3/sample-file-1.mp3" | ||
+ | <FONT color=gray>' ''...oppure con un indirizzo web di una radio on-line:'' | ||
+ | ' '''.URL = "https://giosa.radioca.st/stream"'''</font> | ||
+ | .Play | ||
+ | End With | ||
+ | Else | ||
+ | mp.Stop | ||
+ | mp.Close | ||
+ | Endif | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub MediaPlayer1_Tag(tagList As MediaTagList) | ||
+ | |||
+ | For Each tag As String In tagList.Tags | ||
+ | If Not Meta.Exist(tag) Then | ||
+ | Meta[tag] = tagList[tag] | ||
+ | ss.Push(tag) | ||
+ | ss.Push(tagList[tag]) | ||
+ | Else | ||
+ | ss[ss.Find(tag) + 1] = tagList[tag] | ||
+ | Endif | ||
+ | Next | ||
+ | |||
TextArea1.Clear | TextArea1.Clear | ||
+ | For c As Short = 0 To ss.Max Step 2 | ||
+ | TextArea1.Text &= ss[c] & ": " & ss[c + 1] & gb.NewLine | ||
+ | Next | ||
− | + | End | |
− | + | ||
− | + | ||
− | + | Public Sub MediaPlayer1_Position() | |
+ | |||
+ | Me.Title = Str(Time(0, 0, 0, mp.Pos * 1000)) | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub MediaPlayer1_End() | ||
− | + | ToggleButton1.Value = False | |
− | + | ||
− | + | End | |
− | + | =Gli effetti video con i ''plug-in''= | |
E' possibile ottenere simpatici effetti video utilizzando i ''plug-in'' resi disposibili da ''GStreamer''. | E' possibile ottenere simpatici effetti video utilizzando i ''plug-in'' resi disposibili da ''GStreamer''. | ||
− | + | <BR>Gli effetti video disponibili sono i seguenti: | |
+ | "goom", "goom2k1", "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''. | In tal caso si farà uso anche della Classe ''MediaControl'' che è serve per gestire appositamente i ''plug-in'' di ''GStreamer''. | ||
+ | <BR>Per consentire l'uso dei [https://gstreamer.freedesktop.org/documentation/additional/splitup.html?gi-language=c plugin] dei visualizzatori audio, è necessario avere installati nel sistema i seguenti pacchetti dei [https://gstreamer.freedesktop.org/documentation/additional/splitup.html?gi-language=c plugin]: | ||
+ | <BR> - gstreamer1.0-plugins-bad | ||
+ | <BR> - gstreamer1.0-plugins-base | ||
+ | <BR> - gstreamer1.0-plugins-base-apps | ||
+ | <BR> - gstreamer1.0-plugins-good | ||
+ | <BR> - gstreamer1.0-plugins-ugly | ||
Mostreremo di seguito il codice esenziale per l'utilizzo degli effetti video con i ''plug-In'' (si inserirà anche una ''DrawingArea'' sul ''Form''): | 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 | + | Private mp As MediaPlayer |
+ | |||
+ | |||
+ | Public Sub ToggleButton1_Click() | ||
+ | |||
+ | If ToggleButton1.Value Then | ||
+ | Dim DrawingArea1 As DrawingArea | ||
+ | Dim plugVis As MediaControl | ||
+ | Dim tipoPlug As String[] = ["goom", "goom2k1", "monoscope", "spacescope", | ||
+ | "spectrascope", "synaescope", "wavescope"] | ||
+ | |||
+ | With DrawingArea1 = New DrawingArea(Me) | ||
+ | .X = 10 | ||
+ | .Y = 10 | ||
+ | .W = 300 | ||
+ | .H = 300 | ||
+ | .Background = Color.Black | ||
+ | End With | ||
+ | mp = New MediaPlayer As "MediaPlayer1" | ||
− | ''' | + | <FONT Color=gray>' ''Imposta un plug-in grafico (ad esempio il 7° fra quelli contenuti dal vettore "tipoplug") da mostrare nella "DrawingArea" durante l'esecuzione del file audio:''</font> |
− | + | plugVis = New MediaControl(mp, tipoPlug[6]) | |
− | + | plugVis["style"] = 2 <SUP>[[[#Note|nota 1]]]</sup> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<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(DrawingArea1) | |
− | + | ||
− | + | mp.URL = Media.URL("<FONT color=darkgreen>''/percorso/del/file/audio''</font>") | |
− | + | ||
− | + | mp.Play() | |
− | + | ||
− | + | <FONT Color=gray>' ''La seguente riga deve stare "dopo" il Metodo ".Play()", altrimenti - in caso si arresti e poi si riavvii l'esecuzione del flusso audio - l'esecuzione si arresterà dopo qualche secondo:''</font> | |
− | + | mp.Video.Visualisation = plugVis | |
− | + | Else | |
− | + | mp.Stop | |
− | + | mp.Close | |
− | + | Endif | |
− | <FONT Color=gray>' '' | + | |
− | + | End | |
− | + | ||
− | + | ||
+ | Public Sub MediaPlayer1_End() | ||
+ | |||
+ | mp.Close | ||
+ | |||
+ | End | ||
+ | In questo esempio mostreremo da un indirizzo web di una radio on-line i suoi Metadati e l'effetto grafico di un visualizzatore audio di ''GStreamer''. | ||
+ | <BR>Per consentire l'uso dei [https://gstreamer.freedesktop.org/documentation/additional/splitup.html?gi-language=c plugin] dei visualizzatori audio, è necessario avere installati nel sistema i seguenti pacchetti dei [https://gstreamer.freedesktop.org/documentation/additional/splitup.html?gi-language=c plugin]: | ||
+ | <BR> - gstreamer1.0-plugins-bad | ||
+ | <BR> - gstreamer1.0-plugins-base | ||
+ | <BR> - gstreamer1.0-plugins-base-apps | ||
+ | <BR> - gstreamer1.0-plugins-good | ||
+ | <BR> - gstreamer1.0-plugins-ugly | ||
+ | Private TextArea1 As TextArea | ||
+ | Private DrawingArea1 As DrawingArea | ||
+ | Private ToggleButton1 As ToggleButton | ||
+ | Private mp As MediaPlayer | ||
+ | Private Meta As New Collection | ||
+ | Private ss As New String[] | ||
+ | |||
+ | |||
+ | Public Sub Form_Open() | ||
+ | |||
+ | Me.Resize(Screen.AvailableWidth * 0.33, Screen.AvailableHeight * 0.73) | ||
+ | |||
+ | With TextArea1 = New TextArea(Me) | ||
+ | .X = Me.W * 0.02 | ||
+ | .Y = Me.H * 0.02 | ||
+ | .W = Me.W * 0.96 | ||
+ | .H = Me.H * 0.4 | ||
+ | End With | ||
+ | With DrawingArea1 = New DrawingArea(Me) | ||
+ | .X = Me.W * 0.02 | ||
+ | .Y = Me.H * 0.43 | ||
+ | .W = Me.W * 0.96 | ||
+ | .H = Me.H * 0.46 | ||
+ | End With | ||
+ | With ToggleButton1 = New ToggleButton(Me) As "ToggleButton1" | ||
+ | .W = Me.W * 0.3 | ||
+ | .X = (Me.W * 0.5) - (.W / 2) | ||
+ | .Y = Me.H * 0.9 | ||
+ | .H = Me.H * 0.08 | ||
+ | .Foreground = Color.Green | ||
+ | .Text = "Avvia" | ||
+ | End With | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub ToggleButton1_Click() | ||
+ | |||
+ | If ToggleButton1.Value Then | ||
+ | Dim plugVis As MediaControl | ||
+ | Dim tipoPlug As String[] = ["goom", "goom2k1", "monoscope", "spacescope", | ||
+ | "spectrascope", "synaescope", "wavescope"] | ||
+ | TextArea1.Clear | ||
+ | With mp = New MediaPlayer As "MediaPlayer1" | ||
+ | plugVis = New MediaControl(mp, tipoPlug[6]) | ||
+ | plugVis["style"] = 2 | ||
+ | .SetWindow(DrawingArea1) | ||
+ | <FONT Color=gray>' ''Se invece desieriamo far mostrare gli effetti video dei plugin, indicati sopra nel vettore di tipo Stringa, non su una superficie GUI di Gambas come la "DrawingArea", bensì in una finestra separata, creata automaticamente dalle risorse di GStreamer, allora si sostituità l'istruzione precedente con la seguente:'' | ||
+ | ' '''.Video.Output = New MediaControl(mp, "ximagesink")''' | ||
+ | ' ''Ascoltiamo una radio-web:''</font> | ||
+ | .URL = "https://giosa.radioca.st/stream" | ||
+ | <FONT Color=gray>' ''Se vogliamo eseguire un file audio oppure un file video dovremo sostituire la precedente riga con questa:'' | ||
+ | ' '''.URL = Media.URL("/percorso/del/file/audio/o/video")'''</font> | ||
+ | .Play | ||
+ | <FONT Color=gray>' ''La seguente riga deve stare "dopo" il Metodo ".Play()", altrimenti - in caso si arresti e poi si riavvii l'esecuzione del flusso audio - l'esecuzione si arresterà dopo qualche secondo:''</font> | ||
+ | .Video.Visualisation = plugVis | ||
+ | End With | ||
+ | ToggleButton1.Foreground = Color.Red | ||
+ | ToggleButton1.Text = "Stop" | ||
+ | Else | ||
+ | mp.Stop | ||
+ | mp.Close | ||
+ | ToggleButton1.Foreground = Color.Green | ||
+ | ToggleButton1.Text = "Avvia" | ||
+ | Endif | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub MediaPlayer1_Tag(tagList As MediaTagList) | ||
+ | |||
+ | For Each tag As String In tagList.Tags | ||
+ | If Not Meta.Exist(tag) Then | ||
+ | Meta[tag] = tagList[tag] | ||
+ | ss.Push(tag) | ||
+ | ss.Push(tagList[tag]) | ||
+ | Else | ||
+ | ss[ss.Find(tag) + 1] = tagList[tag] | ||
+ | Endif | ||
+ | Next | ||
+ | |||
+ | TextArea1.Clear | ||
+ | For c As Short = 0 To ss.Max Step 2 | ||
+ | TextArea1.Text &= ss[c] & ": " & ss[c + 1] & gb.NewLine | ||
+ | Next | ||
+ | |||
+ | End | ||
+ | |||
− | + | Public Sub MediaPlayer1_Position() | |
− | + | Me.Title = Str(Time(0, 0, 0, mp.Pos * 1000)) | |
− | + | ||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub MediaPlayer1_End() | ||
+ | |||
+ | ToggleButton1.Value = False | ||
− | + | 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 " | + | 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". <SUP>[[[#Note|nota 2]]]</sup> |
Ovviamente bisognerà avere l'accortezza di avviare il server Jack (per esempio avviando il programma ''qjackctl'') <SPAN Style="text-decoration:underline">prima</span> di lanciare il programma Gambas. | Ovviamente bisognerà avere l'accortezza di avviare il server Jack (per esempio avviando il programma ''qjackctl'') <SPAN Style="text-decoration:underline">prima</span> di lanciare il programma Gambas. | ||
Riga 394: | Riga 559: | ||
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 | ||
With mp = New MediaPlayer | With mp = New MediaPlayer | ||
− | .URL = Media.URL("<FONT color= | + | .URL = Media.URL("<FONT color=darkgreen>''/percorso/del/file/audio''</font>") |
.Audio.Output = New MediaControl(mp, "jackaudiosink") | .Audio.Output = New MediaControl(mp, "jackaudiosink") | ||
.Play | .Play | ||
+ | While mp.Duration < 0.1 | ||
+ | Wait 0.01 | ||
+ | Wend | ||
Wait .Duration | Wait .Duration | ||
.Stop | .Stop | ||
Riga 407: | Riga 575: | ||
End With | End With | ||
− | + | End | |
=Note= | =Note= | ||
− | [1] La stesura di paragrafo è stata possibile anche grazie al fondamentale apporto e studio del membro [http://www.gambas-it.org/smf/index.php?action=profile;u=1141 allegfede] del forum gambas-it.org . | + | [1] Sullo stile dell'elemento "wavescope" vedere: [https://gstreamer.freedesktop.org/documentation/audiovisualizers/wavescope.html?gi-language=c#GstWaveScopeStyle Stile wavescope] |
+ | |||
+ | [2] La stesura di paragrafo è stata possibile anche grazie al fondamentale apporto e studio del membro [http://www.gambas-it.org/smf/index.php?action=profile;u=1141 allegfede] del forum gambas-it.org . |
Versione delle 06:21, 6 dic 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 l'indirizzo web sarà passato direttamente alla Proprietà ".URL");
- il Metodo ".Play()" per avviare l'esecuzione del file audio;
- 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() While mp.Duration < 0.1 Wait 0.01 Wend 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.1 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
Se non si ha interesse ad avere il valore del tempo trascorso dall'inizio dell'esecuzione del file audio, allora il ciclo "Repeat...Until", presente nel codice sopra mostrato, potrà essere sostituito dalla riga:
Wait .Duration
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.
Private mp As MediaPlayer Public Sub Form_Open() With mp = New MediaPlayer As "MediaPlayer1" ' Carica un file audio: .URL = Media.URL("/percorso/del/file/audio") End With ToggleButton1.Text = "Avvia" ToggleButton2.Enabled = False With Slider1 .MinValue = 0 .MaxValue = 100 .Value = 50 End With End Public Sub ToggleButton1_Click() If ToggleButton1.Value Then ToggleButton1.Text = "Stop" ToggleButton2.Enabled = True ToggleButton2.Text = "Pausa" Esegue() Else ' Chiama la funzione per arrestare l'esecuzione del file audio: ToggleButton2.Value = False ToggleButton2.Enabled = False Arresta() Endif End Public Sub Esegue() ' Avvia l'ascolto del file audio: mp.Play End Public Sub Arresta() ' Arresta l'ascolto del file audio: mp.Stop mp.Close ToggleButton1.Text = "Avvia" ToggleButton2.Text = Null 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 ToggleButton2.Text = "Continua" Else If ToggleButton1.Value Then ToggleButton2.Text = "Pausa" Esegue() Endif Endif End Public Sub Slider1_Change() mp.Audio.Volume = Slider1.Value / 100 End Public Sub MediaPlayer1_Position() Me.Title = Str(Time(0, 0, 0, mp.Pos * 1000)) & " Vol. " & Slider1.Value End Public Sub MediaPlayer1_End() ToggleButton1.Value = False End
Eseguire un file dal web
Per eseguire un file audio dal web, l'indirizzo sarà assegnato senza l'uso del Metodo "Media.URL()".
Pertanto, riprendendo il codice sopra mostrato, la riga, ove sarà assegnato l'indirizzo web del file audio alla Proprietà ".URL" della Classe MediaPlayer, sarà la seguente:
.URL = "indirizzo/web/del/file/audio"
Esempio pratico:
.URL = "https://samples-files.com/samples/Audio/mp3/sample-file-1.mp3"
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 While mp.Duration < 0.1 Wait 0.01 Wend 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 While mp.Duration < 0.1 Wait 0.01 Wend Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000) Wait .Duration .Stop .Close End With
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.
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.
Da evidenziare che l'evento "_Tag()" sarà sollevato solo con l'attivazione del Metodo ".Play".
Mostriamo un esempio pratico:
Private mp As MediaPlayer Private Meta As New Collection Private ss As New String[] Public Sub ToggleButton1_Click() If ToggleButton1.Value Then TextArea1.Clear With mp = New MediaPlayer As "MediaPlayer1" .URL = Media.URL("/percorso/del/file/audio") .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.1 Wend mp.Close Else mp.Stop mp.Close Endif End Public Sub MediaPlayer1_Tag(tagList As MediaTagList) For Each tag As String In tagList.Tags If Not Meta.Exist(tag) Then Meta[tag] = tagList[tag] ss.Push(tag) ss.Push(tagList[tag]) Else ss[ss.Find(tag) + 1] = tagList[tag] Endif Next TextArea1.Clear For c As Short = 0 To ss.Max Step 2 TextArea1.Text &= ss[c] & ": " & ss[c + 1] & gb.NewLine Next End
Il seguente codice è più elaborato e prevede l'uso degli Eventi "_Position()" e "_End()" della Classe MediaPlayer al posto del ciclo visto prima.
Private mp As MediaPlayer Private Meta As New Collection Private ss As New String[] Public Sub ToggleButton1_Click() If ToggleButton1.Value Then TextArea1.Clear With mp = New MediaPlayer As "MediaPlayer1" .URL = Media.URL("/percorso/del/file/audio") .Play End With Else mp.Stop mp.Close Endif End ' Se ci sono "Tag" nel file audio, verrà sollevato il seguente evento: Public Sub MediaPlayer1_Tag(tagList As MediaTagList) For Each tag As String In tagList.Tags If Not Meta.Exist(tag) Then Meta[tag] = tagList[tag] ss.Push(tag) ss.Push(tagList[tag]) Else ss[ss.Find(tag) + 1] = tagList[tag] Endif Next TextArea1.Clear For c As Short = 0 To ss.Max Step 2 TextArea1.Text &= ss[c] & ": " & ss[c + 1] & gb.NewLine Next End Public Sub MediaPlayer1_Position() Me.Title = Str(Time(0, 0, 0, mp.Pos * 1000)) End Public Sub MediaPlayer1_End() mp.Close ToggleButton1.Value = False End
Mostrare i Tag di un file audio presente nel web
Mostriamo un caso pratico:
Private mp As MediaPlayer Private Meta As New Collection Private ss As New String[] Public Sub ToggleButton1_Click() If ToggleButton1.Value Then TextArea1.Clear With mp = New MediaPlayer As "MediaPlayer1" ' Nel caso di un indirizzo web, non si deve usare il Metodo "Media.URL(): .URL = "https://samples-files.com/samples/Audio/mp3/sample-file-1.mp3" ' ...oppure con un indirizzo web di una radio on-line: ' .URL = "https://giosa.radioca.st/stream" .Play End With Else mp.Stop mp.Close Endif End Public Sub MediaPlayer1_Tag(tagList As MediaTagList) For Each tag As String In tagList.Tags If Not Meta.Exist(tag) Then Meta[tag] = tagList[tag] ss.Push(tag) ss.Push(tagList[tag]) Else ss[ss.Find(tag) + 1] = tagList[tag] Endif Next TextArea1.Clear For c As Short = 0 To ss.Max Step 2 TextArea1.Text &= ss[c] & ": " & ss[c + 1] & gb.NewLine Next End Public Sub MediaPlayer1_Position() Me.Title = Str(Time(0, 0, 0, mp.Pos * 1000)) End Public Sub MediaPlayer1_End() ToggleButton1.Value = False 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", "goom2k1", "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.
Per consentire l'uso dei plugin dei visualizzatori audio, è necessario avere installati nel sistema i seguenti pacchetti dei plugin:
- gstreamer1.0-plugins-bad
- gstreamer1.0-plugins-base
- gstreamer1.0-plugins-base-apps
- gstreamer1.0-plugins-good
- gstreamer1.0-plugins-ugly
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 MediaPlayer Public Sub ToggleButton1_Click() If ToggleButton1.Value Then Dim DrawingArea1 As DrawingArea Dim plugVis As MediaControl Dim tipoPlug As String[] = ["goom", "goom2k1", "monoscope", "spacescope", "spectrascope", "synaescope", "wavescope"] With DrawingArea1 = New DrawingArea(Me) .X = 10 .Y = 10 .W = 300 .H = 300 .Background = Color.Black End With mp = New MediaPlayer As "MediaPlayer1" ' Imposta un plug-in grafico (ad esempio il 7° fra quelli contenuti dal vettore "tipoplug") da mostrare nella "DrawingArea" durante l'esecuzione del file audio: plugVis = New MediaControl(mp, tipoPlug[6]) plugVis["style"] = 2 [nota 1] ' Si dice al MediaControl di mostrare il proprio output (gli effetti video) in uno specifico controllo GUI, solitamente una DrawingArea: mp.SetWindow(DrawingArea1) mp.URL = Media.URL("/percorso/del/file/audio") mp.Play() ' La seguente riga deve stare "dopo" il Metodo ".Play()", altrimenti - in caso si arresti e poi si riavvii l'esecuzione del flusso audio - l'esecuzione si arresterà dopo qualche secondo: mp.Video.Visualisation = plugVis Else mp.Stop mp.Close Endif End Public Sub MediaPlayer1_End() mp.Close End
In questo esempio mostreremo da un indirizzo web di una radio on-line i suoi Metadati e l'effetto grafico di un visualizzatore audio di GStreamer.
Per consentire l'uso dei plugin dei visualizzatori audio, è necessario avere installati nel sistema i seguenti pacchetti dei plugin:
- gstreamer1.0-plugins-bad
- gstreamer1.0-plugins-base
- gstreamer1.0-plugins-base-apps
- gstreamer1.0-plugins-good
- gstreamer1.0-plugins-ugly
Private TextArea1 As TextArea Private DrawingArea1 As DrawingArea Private ToggleButton1 As ToggleButton Private mp As MediaPlayer Private Meta As New Collection Private ss As New String[] Public Sub Form_Open() Me.Resize(Screen.AvailableWidth * 0.33, Screen.AvailableHeight * 0.73) With TextArea1 = New TextArea(Me) .X = Me.W * 0.02 .Y = Me.H * 0.02 .W = Me.W * 0.96 .H = Me.H * 0.4 End With With DrawingArea1 = New DrawingArea(Me) .X = Me.W * 0.02 .Y = Me.H * 0.43 .W = Me.W * 0.96 .H = Me.H * 0.46 End With With ToggleButton1 = New ToggleButton(Me) As "ToggleButton1" .W = Me.W * 0.3 .X = (Me.W * 0.5) - (.W / 2) .Y = Me.H * 0.9 .H = Me.H * 0.08 .Foreground = Color.Green .Text = "Avvia" End With End Public Sub ToggleButton1_Click() If ToggleButton1.Value Then Dim plugVis As MediaControl Dim tipoPlug As String[] = ["goom", "goom2k1", "monoscope", "spacescope", "spectrascope", "synaescope", "wavescope"] TextArea1.Clear With mp = New MediaPlayer As "MediaPlayer1" plugVis = New MediaControl(mp, tipoPlug[6]) plugVis["style"] = 2 .SetWindow(DrawingArea1) ' Se invece desieriamo far mostrare gli effetti video dei plugin, indicati sopra nel vettore di tipo Stringa, non su una superficie GUI di Gambas come la "DrawingArea", bensì in una finestra separata, creata automaticamente dalle risorse di GStreamer, allora si sostituità l'istruzione precedente con la seguente: ' .Video.Output = New MediaControl(mp, "ximagesink") ' Ascoltiamo una radio-web: .URL = "https://giosa.radioca.st/stream" ' Se vogliamo eseguire un file audio oppure un file video dovremo sostituire la precedente riga con questa: ' .URL = Media.URL("/percorso/del/file/audio/o/video") .Play ' La seguente riga deve stare "dopo" il Metodo ".Play()", altrimenti - in caso si arresti e poi si riavvii l'esecuzione del flusso audio - l'esecuzione si arresterà dopo qualche secondo: .Video.Visualisation = plugVis End With ToggleButton1.Foreground = Color.Red ToggleButton1.Text = "Stop" Else mp.Stop mp.Close ToggleButton1.Foreground = Color.Green ToggleButton1.Text = "Avvia" Endif End Public Sub MediaPlayer1_Tag(tagList As MediaTagList) For Each tag As String In tagList.Tags If Not Meta.Exist(tag) Then Meta[tag] = tagList[tag] ss.Push(tag) ss.Push(tagList[tag]) Else ss[ss.Find(tag) + 1] = tagList[tag] Endif Next TextArea1.Clear For c As Short = 0 To ss.Max Step 2 TextArea1.Text &= ss[c] & ": " & ss[c + 1] & gb.NewLine Next End Public Sub MediaPlayer1_Position() Me.Title = Str(Time(0, 0, 0, mp.Pos * 1000)) End Public Sub MediaPlayer1_End() ToggleButton1.Value = False 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 2]
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 While mp.Duration < 0.1 Wait 0.01 Wend Wait .Duration .Stop .Close End With End
Note
[1] Sullo stile dell'elemento "wavescope" vedere: Stile wavescope
[2] La stesura di paragrafo è stata possibile anche grazie al fondamentale apporto e studio del membro allegfede del forum gambas-it.org .