|
|
(15 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("<FONT color=gray>''/percorso/del/file/audio''</font>")
| |
− |
| |
− | <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
| |
− | Private bo As Boolean
| |
− |
| |
− |
| |
− | '''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("<FONT color=gray>''/percorso/del/file/audio''</font>")
| |
− |
| |
− | '''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) Or (bo = True)
| |
− |
| |
− | 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
| |
− |
| |
− | bo = True
| |
− |
| |
− | '''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'':
| |
− | Private bo As Boolean
| |
− |
| |
− |
| |
− | '''Public''' Sub Main()
| |
− |
| |
− | Dim mp As MediaPlayer
| |
− |
| |
− | With mp = New MediaPlayer
| |
− | .URL = Media.URL("<FONT color=gray>''/percorso/del/file/audio''</font>")
| |
− | .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))
| |
− | Wait 0.01
| |
− | Loop Until (mp.Position >= mp.Duration) Or (bo = True)
| |
− |
| |
− | mp.Stop
| |
− |
| |
− | Quit
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Public''' Sub Application_Read() <FONT color=gray>' ''Premendo il tasto "Invio" della tastiera, si arresta il programma''</font>
| |
− |
| |
− | 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.
| |
− | <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("<FONT color=gray>''/percorso/del/file/audio''</font>")
| |
− |
| |
− | 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("<FONT color=gray>''/percorso/del/file/audio''</font>")
| |
− | .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'''
| |
− | | |
− | | |
− | =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("<FONT color=gray>''/percorso/del/file/audio''</font>")
| |
− |
| |
− | pl.State = Media.Playing
| |
− | pl.Play()
| |
− |
| |
− | <FONT color=gray>' ''Utilizziamo la funzione "Input" per consentire l'esecuzione del file audio,''
| |
− | ' ''evitando un eccessivo aggravio di lavoro per la CPU. Inoltre, premendo il tasto "Invio viene interrotta l'esecuzione."''</font>
| |
− | Input s
| |
− |
| |
− | pl.Stop
| |
− |
| |
− | '''End'''
| |