Differenze tra le versioni di "Eseguire i file audio mediante la Classe ''MediaPipeline'' del componente gb.media"
(Creata pagina con "La classe ''MediaPipeline'' del Componente ''gb.media'' consente di gestire i file audio previa concatenazione dei plugin e degli elementi forniti dalla risorsa ''GStreamer''....") |
|||
(43 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | La classe ''MediaPipeline'' del Componente ''gb.media'' consente di gestire i file audio previa concatenazione dei plugin e degli elementi forniti dalla risorsa ''GStreamer''. In particolare 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. | + | La classe ''MediaPipeline'' del Componente ''gb.media'' consente di gestire i file audio previa concatenazione dei plugin e degli elementi forniti dalla risorsa ''GStreamer''. |
+ | <BR>In particolare 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. <SUP>[[[#Note|nota 1]]]</sup> | ||
− | + | =Usare la Classe "MediaPipeline" con il decoder "playbin" di GStreamer= | |
+ | La Classe ''MediaPipeline'' 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'': | Mostriamo un esempio pratico in un'applicazione ''a riga di comando'': | ||
− | + | Private bo As Boolean | |
+ | |||
+ | |||
+ | Public Sub Main() | ||
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
− | |||
− | + | pl = New MediaPipeline(Null, "<FONT color=#B22222>playbin</font>") As "PLine" | |
− | + | pl["uri"] = Media.URL("<FONT color=darkgreen>''/percorso/del/file/audio''</font>") | |
− | + | ||
− | + | pl.Play() | |
− | + | ||
− | + | Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) | |
− | <FONT color=gray>' '' | + | Repeat |
− | + | Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) | |
− | + | Wait 0.01 | |
− | + | Until bo | |
− | + | ||
− | + | pl.Close | |
− | + | ||
− | + | Print "\n\e[0mEsecuzione terminata !" | |
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub PLine_End() <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font> | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
Il plugin "''playbin''" può anche essere inserito all'interno di un oggetto della Classe ''MediaControl'', la quale rappresenta un Elemento ordinario di ''GStreamer''. | Il plugin "''playbin''" può anche essere inserito all'interno di un oggetto della Classe ''MediaControl'', la quale rappresenta un Elemento ordinario di ''GStreamer''. | ||
− | + | <BR>In quest'altro esempio mediante apposito ciclo sarà mostrato anche il tempo trascorso dall'esecuzione del file audio. Il ciclo si arresterà al termine dell'esecuzione del file. | |
+ | Private bo As Boolean | ||
+ | |||
+ | |||
+ | Public Sub Main() | ||
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
Dim mc As MediaControl | Dim mc As MediaControl | ||
− | + | ||
− | + | pl = New MediaPipeline As "PLine" | |
− | |||
− | + | mc = New MediaControl(pl, "<FONT color=#B22222>playbin</font>") | |
− | + | mc["uri"] = Media.URL("<FONT color=darkgreen>''/percorso/del/file/audio''</font>") | |
− | + | pl.Play() | |
− | + | ||
− | <FONT color=gray>' '' | + | Print "Durata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) |
− | + | Repeat | |
− | + | Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) | |
− | + | Wait 0.01 | |
− | + | Until bo | |
− | + | ||
− | + | pl.Close | |
+ | |||
+ | Print "\n\e[0mEsecuzione terminata !" | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub PLine_End() <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font> | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
+ | =Usare la Classe "MediaPipeline" con il decoder "decodebin" di GStreamer= | ||
+ | E' possibile eseguire i file audio utilizzando il plugin di "decodebin" oppure "decodebin3" di GStreamer. | ||
− | + | Mostriamo un esempio pratico a "riga di comando": | |
− | + | Private bo As Boolean | |
+ | |||
+ | |||
+ | Public Sub Main() | ||
+ | |||
+ | Dim pl As MediaPipeline | ||
+ | Dim src, dcb, con, vol, snk As MediaControl | ||
+ | |||
+ | pl = New MediaPipeline As "PLine" | ||
+ | |||
+ | src = New MediaControl(pl, "filesrc") | ||
+ | src["location"] = "<FONT color=darkgreen>''/percorso/del/file/audio''</font>" | ||
+ | |||
+ | dcb = New MediaControl(pl, "<FONT color=#B22222>decodebin</font>") | ||
+ | con = New MediaControl(pl, "audioconvert") | ||
+ | vol = New MediaControl(pl, "volume") <FONT color=gray>' ''<1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100%''</font> | ||
+ | vol["volume"] = 0.5 | ||
+ | snk = New MediaControl(pl, "autoaudiosink") | ||
+ | |||
+ | src.LinkTo(dcb) | ||
+ | dcb.LinkTo(con) | ||
+ | con.LinkTo(vol) | ||
+ | vol.LinkTo(snk) | ||
+ | |||
+ | pl.Play() | ||
+ | |||
+ | Repeat | ||
+ | Write "\rTempo Trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000)) | ||
+ | Wait 0.01 | ||
+ | Until bo | ||
+ | |||
+ | pl.Close() | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub PLine_End() | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
− | + | =Utilizzare i plugin di GStreamer con le Classi ''MediaControl'' e ''MediaPipeline'' per eseguire file di specifici formati audio= | |
+ | E' possibile eseguire i file audio utilizzando specifici plugin di GStreamer <SUP>[[[#Note|nota 2]]]</sup> con le Classi ''MediaControl'' e ''MediaPipeline''. | ||
− | + | Mostriamo di seguito alcuni esempi per l'esecuzione di file audio. | |
− | + | ||
− | + | ===Eseguire un file WAV=== | |
+ | In questo caso si utilizzeranno i plug-in specifici per eseguire un file di formato WAV. | ||
+ | Private bo As Boolean | ||
+ | |||
+ | |||
+ | Public Sub Main() | ||
+ | |||
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
− | Dim src, dcd, cnv, snk As MediaControl | + | Dim src, dcd, cnv, vol, snk As MediaControl |
− | + | ||
− | + | pl = New MediaPipeline As "PLine" | |
− | + | ||
− | + | src = New MediaControl(pl, "filesrc") | |
− | + | src["location"] = "<FONT color=darkgreen>''/percorso/del/file.wav''</font>" | |
− | + | ||
− | + | dcd = New MediaControl(pl, "<FONT color=#B22222>wavparse</font>") | |
− | + | cnv = New MediaControl(pl, "audioconvert") | |
− | + | vol = New MediaControl(pl, "volume") <FONT color=gray>' ''<1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100%''</font> | |
− | + | vol["volume"] = 0.5 | |
− | + | snk = New MediaControl(pl, "alsasink") | |
− | + | src.LinkTo(dcd) | |
− | + | dcd.LinkTo(cnv) | |
− | + | cnv.LinkTo(vol) | |
− | + | vol.LinkTo(snk) | |
− | + | ||
− | + | pl.Play() | |
− | + | ||
− | + | Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) | |
− | + | Repeat | |
− | + | Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) | |
− | + | Wait 0.01 | |
− | + | Until bo | |
− | ''' | + | |
− | + | pl.Close() | |
+ | |||
+ | Print "\n\e[0mEsecuzione terminata !" | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub PLine_End() <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font> | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
In quest'altro esempio si potranno impostare i valori della frequenza di campionamento (rate) e dei canali, nonché modificare in "tempo reale" mediante tre ''Slider'' i valori della tonalità, del tempo di esecuzione e del volume d'uscita. Le due impostazioni relative alla tonalità e al tempo di esecuzione verranno effettuate con il plugin "pitch", considerando che: | In quest'altro esempio si potranno impostare i valori della frequenza di campionamento (rate) e dei canali, nonché modificare in "tempo reale" mediante tre ''Slider'' i valori della tonalità, del tempo di esecuzione e del volume d'uscita. Le due impostazioni relative alla tonalità e al tempo di esecuzione verranno effettuate con il plugin "pitch", considerando che: | ||
* per impostare la tonalità si userà l'omonima proprietà "pitch": il valore di partenza predefinito è 1.0; | * per impostare la tonalità si userà l'omonima proprietà "pitch": il valore di partenza predefinito è 1.0; | ||
− | * per impostare la velocità del tempo di esecuzione si userà la proprietà "tempo": il valore di partenza predefinito è 1.0. | + | * per impostare la velocità del tempo metronomico di esecuzione si userà la proprietà "tempo": il valore di partenza predefinito è 1.0; |
+ | * per impostare il volume dell'audio si userà la proprietà "volume": il valore di partenza predefinito è 1.0. | ||
Private pl As MediaPipeline | Private pl As MediaPipeline | ||
Private pit As MediaControl | Private pit As MediaControl | ||
Riga 91: | Riga 179: | ||
Private tempo As Float = 1.00 | Private tempo As Float = 1.00 | ||
Private volume As Float = 1.00 | Private volume As Float = 1.00 | ||
+ | Private bo As Boolean | ||
− | + | Public Sub Form_Open() | |
Dim src, par, cnv, res, enc, cnv2, snk As MediaControl | Dim src, par, cnv, res, enc, cnv2, snk As MediaControl | ||
Dim flt As MediaFilter | Dim flt As MediaFilter | ||
− | + | pl = New MediaPipeline As "PLine" | |
− | + | ||
− | + | src = New MediaControl(pl, "filesrc") | |
− | + | src["location"] = "<FONT color=darkgreen>''/percorso/del/file.wav''</font>" | |
− | + | par = New MediaControl(pl, "<FONT color=#B22222>wavparse</font>") | |
− | + | cnv = New MediaControl(pl, "audioconvert") | |
− | + | res = New MediaControl(pl, "audioresample") | |
− | + | flt = New MediaFilter(pl, "audio/x-raw,rate=44100,channels=2") | |
− | + | pit = New MediaControl(pl, "pitch") | |
− | + | vol = New MediaControl(pl, "volume") | |
− | + | cnv2 = New MediaControl(pl, "audioconvert") | |
− | + | snk = New MediaControl(pl, "alsasink") | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | src.LinkTo(par) | ||
+ | par.LinkTo(cnv) | ||
+ | cnv.LinkTo(res) | ||
+ | res.LinkTo(flt) | ||
+ | flt.LinkTo(pit) | ||
+ | pit.LinkTo(cnv2) | ||
+ | cnv2.LinkTo(vol) | ||
+ | vol.LinkTo(snk) | ||
+ | |||
<FONT Color=gray>' ''Imposta alcuni valori dei due "Slider":''</font> | <FONT Color=gray>' ''Imposta alcuni valori dei due "Slider":''</font> | ||
− | + | With Slider1 | |
− | + | .MinValue = 0 | |
− | + | .MaxValue = 1000 | |
− | + | .Value = 100 | |
− | + | End With | |
− | + | With Slider2 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
.MinValue = 0 | .MinValue = 0 | ||
.MaxValue = 1000 | .MaxValue = 1000 | ||
.Value = 100 | .Value = 100 | ||
− | + | End With | |
− | + | With Slider3 | |
− | + | .MinValue = 0 | |
− | + | .MaxValue = 1000 | |
− | + | .Value = 100 | |
+ | End With | ||
+ | |||
+ | End | ||
+ | |||
+ | Public Sub Button1_Click() | ||
+ | |||
pl.Play() | pl.Play() | ||
− | + | Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) | |
− | + | Repeat | |
+ | Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) | ||
Wait 0.01 | Wait 0.01 | ||
− | + | Until bo | |
− | + | ||
− | + | pl.Close() | |
+ | |||
+ | Print "\n\e[0mEsecuzione terminata !" | ||
+ | |||
+ | End | ||
+ | |||
+ | Public Sub Button2_Click() | ||
− | |||
− | |||
pl.Stop() | pl.Stop() | ||
pl.Close() | pl.Close() | ||
− | + | <FONT Color=gray>' ''Consente di arrestare anche il ciclo del conteggio del tempo trascorso:''</font> | |
− | ''' | + | bo = True |
+ | |||
+ | End | ||
+ | |||
+ | Public Sub Slider1_Change() <FONT Color=gray>' ''Modifica la Tonalità''</font> | ||
− | |||
− | |||
pitch = Slider1.Value / 100 | pitch = Slider1.Value / 100 | ||
pit["pitch"] = pitch | pit["pitch"] = pitch | ||
ValueBox1.Value = pitch | ValueBox1.Value = pitch | ||
− | |||
− | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub Slider2_Change() <FONT Color=gray>' ''Modifica il Tempo metronomico''</font> | ||
− | |||
− | |||
tempo = Slider2.Value / 100 | tempo = Slider2.Value / 100 | ||
pit["tempo"] = tempo | pit["tempo"] = tempo | ||
ValueBox2.Value = tempo | ValueBox2.Value = tempo | ||
− | |||
− | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub Slider3_Change() <FONT Color=gray>' ''Modifica il Volume''</font> | ||
− | |||
− | |||
volume = Slider3.Value / 100 | volume = Slider3.Value / 100 | ||
vol["volume"] = volume <FONT Color=gray>' ''"volume" è una proprietà dell'omonimo plugin "volume"''</font> | vol["volume"] = volume <FONT Color=gray>' ''"volume" è una proprietà dell'omonimo plugin "volume"''</font> | ||
ValueBox3.Value = volume | ValueBox3.Value = volume | ||
− | + | ||
− | ''' | + | End |
+ | |||
+ | |||
+ | Public Sub PLine_End() <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font> | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
− | + | ===Eseguire un file MP3=== | |
− | + | Private bo As Boolean | |
− | + | ||
− | + | ||
− | + | Public Sub Main() | |
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
− | Dim src, map, mad, snk As MediaControl | + | Dim src, map, mad, vol, snk As MediaControl |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | pl = New MediaPipeline As "PLine" | |
− | |||
− | + | src = New MediaControl(pl, "filesrc") | |
− | + | src["location"] = "<FONT color=darkgreen>''/percorso/del/file.mp3''</font>" | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | map = New MediaControl(pl, "<FONT color=#B22222>mpegaudioparse</font>") | |
− | + | mad = New MediaControl(pl, "<FONT color=#B22222>mpg123audiodec</font>") | |
− | + | vol = New MediaControl(pl, "volume") <FONT color=gray>' ''<1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100%''</font> | |
− | + | vol["volume"] = 0.5 | |
− | + | snk = New MediaControl(pl, "autoaudiosink") | |
− | + | src.LinkTo(map) | |
− | + | map.LinkTo(mad) | |
− | + | mad.LinkTo(vol) | |
− | + | vol.LinkTo(snk) | |
− | + | ||
− | + | pl.Play() | |
− | + | ||
− | + | Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) | |
− | + | Repeat | |
− | + | Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) | |
− | + | Wait 0.01 | |
− | + | Until bo | |
− | + | ||
− | + | pl.Close | |
− | + | ||
− | + | Print "\n\e[0mEsecuzione terminata !" | |
− | + | ||
− | + | End | |
− | + | ||
− | + | ||
− | + | Public Sub PLine_End() <FONT color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font> | |
− | + | ||
− | + | bo = True | |
− | + | ||
− | + | End | |
− | + | ||
− | + | ||
− | + | ===Eseguire un file OGG=== | |
− | + | Private bo as Boolean | |
− | + | ||
− | + | ||
− | + | Public Sub Main() | |
− | + | ||
− | + | Dim pl As MediaPipeline | |
− | + | Dim src, dem, vor, vol, snk As MediaControl | |
− | + | ||
− | + | pl = New MediaPipeline As "PLine" | |
− | + | ||
− | + | src = New MediaControl(pl, "filesrc") | |
− | + | src["location"] = "<FONT color=darkgreen>''/percorso/del/file.ogg''</font>" | |
− | + | ||
− | + | dem = New MediaControl(pl, "<FONT color=#B22222>oggdemux</font>") | |
− | + | vor = New MediaControl(pl, "<FONT color=#B22222>vorbisdec</font>") | |
− | + | vol = New MediaControl(pl, "volume") <FONT color=gray>' ''<1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100%''</font> | |
− | + | vol["volume"] = 0.5 | |
− | + | snk = New MediaControl(pl, "autoaudiosink") | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | src.LinkTo(dem) | ||
+ | dem.LinkLaterTo(vor) | ||
+ | vor.LinkTo(vol) | ||
+ | vol.LinkTo(snk) | ||
− | + | pl.Play() | |
− | + | Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) | |
+ | Repeat | ||
+ | Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) | ||
+ | Wait 0.01 | ||
+ | Until bo | ||
+ | |||
+ | pl.Close | ||
− | + | Write "\nEsecuzione terminata !" | |
− | + | ||
− | + | End | |
− | + | ||
− | + | ||
− | + | Public Sub PLine_End() | |
− | + | ||
− | + | bo = True | |
− | + | ||
− | + | End | |
− | + | ||
− | + | ||
− | + | ===Eseguire un file AAC=== | |
− | + | Private bo As Boolean | |
− | + | ||
− | + | ||
− | + | Public Sub Main() | |
− | + | ||
− | + | Dim pl As MediaPipeline | |
− | + | Dim src, dcd, snk As MediaControl | |
− | + | ||
− | + | pl = New MediaPipeline As "PLine" | |
− | + | ||
− | + | src = New MediaControl(pl, "filesrc") | |
− | + | src["location"] = "<FONT color=darkgreen>''/percorso/del/file.aac''</font>" | |
− | + | ||
− | + | dcd = New MediaControl(pl, "<FONT color=#B22222>faad</font>") | |
− | + | snk = New MediaControl(pl, "alsasink") | |
− | + | src.LinkTo(dcd) | |
− | + | dcd.LinkTo(snk) | |
− | + | ||
− | + | pl.Play() | |
− | + | ||
− | + | Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) | |
− | + | Repeat | |
− | + | Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) | |
− | + | Wait 0.01 | |
− | + | Until bo | |
− | + | ||
− | + | pl.Close | |
− | + | ||
− | + | Write "\nEsecuzione terminata !" | |
− | + | ||
− | + | End | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Public Sub PLine_End() | |
− | + | bo = True | |
− | + | End | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ===Eseguire un file FLAC=== | |
− | '' | + | Private bo As Boolean |
+ | |||
+ | |||
+ | Public Sub Main() | ||
+ | |||
+ | Dim pl As MediaPipeline | ||
+ | Dim src, fpa, fde, snk As MediaControl | ||
+ | |||
+ | pl = New MediaPipeline As "PLine" | ||
+ | |||
+ | src = New MediaControl(pl, "filesrc") | ||
+ | src["location"] = "<FONT color=darkgreen>''/percorso/del/file.flac''</font>" | ||
+ | |||
+ | fpa = New MediaControl(pl, "<FONT color=#B22222>flacparse</font>") | ||
+ | fde = New MediaControl(pp, "<FONT color=#B22222>flacdec</font>") | ||
+ | snk = New MediaControl(pl, "alsasink") | ||
+ | |||
+ | src.LinkTo(fpa) | ||
+ | fpa.LinkTo(fde) | ||
+ | fde.LinkTo(snk) | ||
+ | |||
+ | pl.Play() | ||
+ | |||
+ | Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) | ||
+ | Repeat | ||
+ | Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) | ||
+ | Wait 0.01 | ||
+ | Until bo | ||
+ | |||
+ | pl.Close | ||
+ | |||
+ | Write "\nEsecuzione terminata !" | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub PLine_End() | ||
− | + | bo = True | |
− | |||
− | pl = New MediaPipeline | + | End |
− | + | ||
+ | |||
+ | ==Estrarre i Tag da un file audio== | ||
+ | E' possibile estrarre da un file gli eventuali Metadati mediante l'Evento "_Tag()" della Classe ''MediaPipeline''. | ||
+ | |||
+ | Mostriamo un esempio che prevede l'estrazione dei Tag metadati da un file audio di formato MP3: | ||
+ | Private pl As MediaPipeline | ||
+ | Private Meta As New Collection | ||
+ | Private ss As New String[] | ||
+ | |||
+ | |||
+ | Public Sub ToggleButton1_Click() | ||
+ | |||
+ | Dim src, map, mad, snk As MediaControl | ||
+ | |||
+ | If ToggleButton1.Value Then | ||
+ | TextArea1.Clear | ||
+ | pl = New MediaPipeline As "PLine" | ||
src = New MediaControl(pl, "filesrc") | src = New MediaControl(pl, "filesrc") | ||
− | src["location"] = "<FONT color= | + | src["location"] = "<FONT color=darkgreen>''/percorso/del/file/audio''</font>" |
− | + | map = New MediaControl(pl, "mpegaudioparse") | |
− | + | mad = New MediaControl(pl, "mpg123audiodec") | |
− | snk = New MediaControl(pl, " | + | snk = New MediaControl(pl, "autoaudiosink") |
− | src.LinkTo( | + | |
− | + | src.LinkTo(map) | |
− | + | map.LinkTo(mad) | |
− | pl.Play | + | mad.LinkTo(snk) |
− | + | ||
− | While pl. | + | pl.Play |
− | + | ||
− | Wait 0. | + | While pl.Duration < 0.1 |
+ | Wait 0.01 | ||
+ | Wend | ||
+ | While pl.State == Media.Playing | ||
+ | Me.Title = Str(Time(0, 0, 0, pl.Pos * 1000)) | ||
+ | Wait 0.1 | ||
+ | Wend | ||
+ | pl.Close | ||
+ | Else | ||
+ | pl.Stop | ||
+ | pl.Close | ||
+ | Endif | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub PLine_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 | ||
+ | |||
+ | |||
+ | ===Estrarre i Tag da un file sito in una pagina web=== | ||
+ | Mostriamo un esempio pratico: | ||
+ | Private pl As MediaPipeline | ||
+ | Private Meta As New Collection | ||
+ | Private ss As New String[] | ||
+ | |||
+ | |||
+ | Public Sub ToggleButton1_Click() | ||
+ | |||
+ | Dim src, map, mad, snk As MediaControl | ||
+ | |||
+ | If ToggleButton1.Value Then | ||
+ | TextArea1.Clear | ||
+ | pl = New MediaPipeline As "PLine" | ||
+ | src = New MediaControl(pl, "souphttpsrc") | ||
+ | src["location"] = "https://samples-files.com/samples/Audio/mp3/sample-file-1.mp3" | ||
+ | map = New MediaControl(pl, "mpegaudioparse") | ||
+ | mad = New MediaControl(pl, "mpg123audiodec") | ||
+ | snk = New MediaControl(pl, "autoaudiosink") | ||
+ | |||
+ | src.LinkTo(map) | ||
+ | map.LinkTo(mad) | ||
+ | mad.LinkTo(snk) | ||
+ | |||
+ | pl.Play | ||
+ | |||
+ | While pl.Duration < 0.1 | ||
+ | Wait 0.01 | ||
+ | Wend | ||
+ | While pl.State == Media.Playing | ||
+ | Me.Title = Str(Time(0, 0, 0, pl.Pos * 1000)) | ||
+ | Wait 0.1 | ||
+ | Wend | ||
+ | pl.Close | ||
+ | Else | ||
+ | pl.Stop | ||
+ | pl.Close | ||
+ | Endif | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub PLine_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 | ||
+ | Se si tratta dell'inirizzo web di una radio om-line, allora useremo il decoder ''decodebin''. | ||
+ | <BR>Esempio pratico: | ||
+ | Private pl As MediaPipeline | ||
+ | Private Meta As New Collection | ||
+ | Private ss As New String[] | ||
+ | |||
+ | |||
+ | Public Sub ToggleButton1_Click() | ||
+ | |||
+ | Dim src, dcb, con, snk As MediaControl | ||
+ | |||
+ | If ToggleButton1.Value Then | ||
+ | TextArea1.Clear | ||
+ | pl = New MediaPipeline As "PLine" | ||
+ | src = New MediaControl(pl, "souphttpsrc") | ||
+ | src["location"] = "https://giosa.radioca.st/stream" | ||
+ | dcb = New MediaControl(pl, "<Font color=red>decodebin</font>") | ||
+ | con = New MediaControl(pl, "audioconvert") | ||
+ | snk = New MediaControl(pl, "autoaudiosink") | ||
+ | |||
+ | src.LinkTo(dcb) | ||
+ | dcb.LinkLaterTo(con) | ||
+ | con.LinkTo(snk) | ||
+ | |||
+ | pl.Play | ||
+ | |||
+ | While pl.Position < 0.1 | ||
+ | Wait 0.01 | ||
+ | Wend | ||
+ | While pl.State == Media.Playing | ||
+ | Me.Title = Str(Time(0, 0, 0, pl.Pos * 1000)) | ||
+ | Wait 0.1 | ||
Wend | Wend | ||
− | + | pl.Close | |
− | + | Else | |
+ | pl.Stop | ||
+ | pl.Close | ||
+ | Endif | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub PLine_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 | ||
− | ==== | + | ==Mostrare i plug-in dei visualizzatori grafici di Gstreamer== |
− | + | 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 pl As MediaPipeline | ||
+ | |||
+ | |||
+ | Public Sub ToggleButton1_Click() | ||
− | Dim | + | If ToggleButton1.Value Then |
− | + | Dim DrawingArea1 As DrawingArea | |
− | + | Dim src, dcb, tee, que1, que2 As MediaControl | |
− | pl = New MediaPipeline | + | Dim vcon, plug, vsnk As MediaControl |
− | + | Dim acon, asnk 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 | ||
+ | |||
+ | pl = New MediaPipeline As "PLine" | ||
+ | |||
src = New MediaControl(pl, "filesrc") | src = New MediaControl(pl, "filesrc") | ||
− | src["location"] = "<FONT color= | + | src["location"] = "<FONT color=darkgreen>''/percorso/del/file/audio''</font>" |
− | + | dcb = New MediaControl(pl, "decodebin") | |
− | + | tee = New MediaControl(pl, "tee") | |
− | + | que1 = New MediaControl(pl, "queue") | |
− | + | vcon = New MediaControl(pl, "audioconvert") | |
− | + | plug = New MediaControl(pl, tipoPlug[6]) | |
− | + | plug["style"] = 2 <SUP>[[[#Note|nota 3]]]</sup> | |
− | + | vsnk = New MediaControl(pl, "ximagesink") | |
− | + | que2 = New MediaControl(pl, "queue") | |
− | + | acon = New MediaControl(pl, "audioconvert") | |
+ | asnk = New MediaControl(pl, "autoaudiosink") | ||
+ | |||
+ | src.LinkTo(dcb) | ||
+ | dcb.LinkLaterTo(tee) | ||
+ | <FONT Color=gray>' '''''Parte video:'''''</font> | ||
+ | tee.LinkTo(que1) | ||
+ | que1.LinkTo(vcon) | ||
+ | vcon.LinkTo(plug) | ||
+ | plug.LinkTo(vsnk) | ||
+ | <FONT Color=gray>' '''''Parte audio:'''''</font> | ||
+ | tee.LinkTo(que2) | ||
+ | que2.LinkTo(acon) | ||
+ | acon.LinkTo(asnk) | ||
+ | <FONT Color=gray>' ''Si dice al MediaControl di mostrare il proprio output (gli effetti video) in uno specifico controllo GUI, solitamente una DrawingArea:''</font> | ||
+ | vsnk.SetWindow(DrawingArea1) | ||
+ | |||
pl.Play() | pl.Play() | ||
− | + | While (pl.Duration < 0.1) Or (pl.Pos < 0.1) | |
− | While pl.Duration | + | Wait 0.01 |
− | |||
Wend | Wend | ||
+ | |||
+ | Wait pl.Duration | ||
+ | |||
+ | Else | ||
+ | pl.Stop | ||
+ | pl.Close | ||
+ | Endif | ||
− | + | End | |
+ | |||
+ | |||
+ | Public Sub PLine_Position() | ||
+ | |||
+ | Me.Title = Str(Time(0, 0, 0, pl.Pos * 1000)) | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub PLine_End() | ||
+ | |||
+ | pl.Close | ||
+ | ToggleButton1.Value = False | ||
+ | |||
+ | End | ||
− | + | ==Interfacciare le Classi ''MediaControl'' e ''MediaPipeline'' con il plugin "''jackaudiosink''" di ''GStreamer'' per eseguire i file audio== | |
Per eseguire i file audio con le Classi ''MediaControl'' e ''MediaPipeline'' è 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''". | Per eseguire i file audio con le Classi ''MediaControl'' e ''MediaPipeline'' è 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''". | ||
Riga 617: | Riga 752: | ||
Mostriamo un semplice esempio di esecuzione di un file wav in un'applicazione ''a riga di comando'': | Mostriamo un semplice esempio di esecuzione di un file wav in un'applicazione ''a riga di comando'': | ||
− | + | Private bo As Boolean | |
+ | |||
+ | |||
+ | Public Sub Main() | ||
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
Dim src, prs, cnv, snk As MediaControl | Dim src, prs, cnv, snk As MediaControl | ||
− | pl = New MediaPipeline | + | pl = New MediaPipeline As "PLine" |
src = New MediaControl(pl, "filesrc") | src = New MediaControl(pl, "filesrc") | ||
− | src["location"] = "<FONT color= | + | src["location"] = "<FONT color=darkgreen>''/percorso/del/file.wav''</font>" |
prs = New MediaControl(pl, "wavparse") | prs = New MediaControl(pl, "wavparse") | ||
cnv = New MediaControl(pl, "audioconvert") | cnv = New MediaControl(pl, "audioconvert") | ||
Riga 635: | Riga 773: | ||
pl.Play() | pl.Play() | ||
+ | |||
+ | Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) | ||
+ | Repeat | ||
+ | Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) | ||
+ | Wait 0.01 | ||
+ | Until bo | ||
+ | |||
+ | pl.Close() | ||
+ | |||
+ | Write "\nEsecuzione terminata !" | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub PLine_End() | ||
− | + | bo = True | |
− | |||
− | + | End | |
− | |||
− | |||
− | |||
+ | =Note= | ||
+ | [1] Nel sistema multimediale ''GStreamer'' una "''Pipeline'' " è una sequenza di elementi collegati tra loro, e costituisce la struttura su cui si basa GStreamer per processare un flusso multimediale. | ||
+ | <BR>Il flusso dati che attraversa la pipeline consiste in una combinazione di ''buffer'' ed eventi. Gli ''eventi'' contengono informazioni di controllo, come la notifica di ricezione di un metadato, di un comando di seeking (ad esempio permettere in stato di “pause” la pipeline) oppure la fine dello stream (EOS). Il ''buffer'' è l’unità base in cui un segnale è suddiviso. | ||
+ | <BR>Il segnale viene partizionato in ''buffer'' già dal primo elemento che fa da ''source'' (sorgente). Dopodiché l’elemento successivo riceve il ''buffer'' tramite la sua interfaccia ''sink-pad'', e lo passa all’elemento seguente tramite il suo ''source-pad'', e così via fino all’ultimo elemento che riceverà il ''buffer''. | ||
+ | [2] Per avere contezza di quali siano i plugin ed i filtri da utilizzare, è opportuno vedere sulla rete la [https://gstreamer.freedesktop.org/documentation/ documentazione di GStreamer] e gli eventuali esempi pratici. | ||
− | + | [3] Sullo stile dell'elemento "wavescope" vedere: [https://gstreamer.freedesktop.org/documentation/audiovisualizers/wavescope.html?gi-language=c#GstWaveScopeStyle Stile wavescope] | |
− | [ | ||
− | |||
− | |||
− | |||
− |
Versione delle 18:09, 11 gen 2024
La classe MediaPipeline del Componente gb.media consente di gestire i file audio previa concatenazione dei plugin e degli elementi forniti dalla risorsa GStreamer.
In particolare 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. [nota 1]
Indice
- 1 Usare la Classe "MediaPipeline" con il decoder "playbin" di GStreamer
- 2 Usare la Classe "MediaPipeline" con il decoder "decodebin" di GStreamer
- 3 Utilizzare i plugin di GStreamer con le Classi MediaControl e MediaPipeline per eseguire file di specifici formati audio
- 3.1 Eseguire un file WAV
- 3.2 Eseguire un file MP3
- 3.3 Eseguire un file OGG
- 3.4 Eseguire un file AAC
- 3.5 Eseguire un file FLAC
- 3.6 Estrarre i Tag da un file audio
- 3.7 Mostrare i plug-in dei visualizzatori grafici di Gstreamer
- 3.8 Interfacciare le Classi MediaControl e MediaPipeline con il plugin "jackaudiosink" di GStreamer per eseguire i file audio
- 4 Note
Usare la Classe "MediaPipeline" con il decoder "playbin" di GStreamer
La Classe MediaPipeline 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:
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline pl = New MediaPipeline(Null, "playbin") As "PLine" pl["uri"] = Media.URL("/percorso/del/file/audio") pl.Play() Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) Repeat Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until bo pl.Close Print "\n\e[0mEsecuzione terminata !" End Public Sub PLine_End() ' Questo Evento viene sollevato, quando l'operazione è terminata bo = True End
Il plugin "playbin" può anche essere inserito all'interno di un oggetto della Classe MediaControl, la quale rappresenta un Elemento ordinario di GStreamer.
In quest'altro esempio mediante apposito ciclo sarà mostrato anche il tempo trascorso dall'esecuzione del file audio. Il ciclo si arresterà al termine dell'esecuzione del file.
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim mc As MediaControl pl = New MediaPipeline As "PLine" mc = New MediaControl(pl, "playbin") mc["uri"] = Media.URL("/percorso/del/file/audio") pl.Play() Print "Durata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) Repeat Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until bo pl.Close Print "\n\e[0mEsecuzione terminata !" End Public Sub PLine_End() ' Questo Evento viene sollevato, quando l'operazione è terminata bo = True End
Usare la Classe "MediaPipeline" con il decoder "decodebin" di GStreamer
E' possibile eseguire i file audio utilizzando il plugin di "decodebin" oppure "decodebin3" di GStreamer.
Mostriamo un esempio pratico a "riga di comando":
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim src, dcb, con, vol, snk As MediaControl pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file/audio" dcb = New MediaControl(pl, "decodebin") con = New MediaControl(pl, "audioconvert") vol = New MediaControl(pl, "volume") ' <1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100% vol["volume"] = 0.5 snk = New MediaControl(pl, "autoaudiosink") src.LinkTo(dcb) dcb.LinkTo(con) con.LinkTo(vol) vol.LinkTo(snk) pl.Play() Repeat Write "\rTempo Trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until bo pl.Close() End Public Sub PLine_End() bo = True End
Utilizzare i plugin di GStreamer con le Classi MediaControl e MediaPipeline per eseguire file di specifici formati audio
E' possibile eseguire i file audio utilizzando specifici plugin di GStreamer [nota 2] con le Classi MediaControl e MediaPipeline.
Mostriamo di seguito alcuni esempi per l'esecuzione di file audio.
Eseguire un file WAV
In questo caso si utilizzeranno i plug-in specifici per eseguire un file di formato WAV.
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim src, dcd, cnv, vol, snk As MediaControl pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.wav" dcd = New MediaControl(pl, "wavparse") cnv = New MediaControl(pl, "audioconvert") vol = New MediaControl(pl, "volume") ' <1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100% vol["volume"] = 0.5 snk = New MediaControl(pl, "alsasink") src.LinkTo(dcd) dcd.LinkTo(cnv) cnv.LinkTo(vol) vol.LinkTo(snk) pl.Play() Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) Repeat Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until bo pl.Close() Print "\n\e[0mEsecuzione terminata !" End Public Sub PLine_End() ' Questo Evento viene sollevato, quando l'operazione è terminata bo = True End
In quest'altro esempio si potranno impostare i valori della frequenza di campionamento (rate) e dei canali, nonché modificare in "tempo reale" mediante tre Slider i valori della tonalità, del tempo di esecuzione e del volume d'uscita. Le due impostazioni relative alla tonalità e al tempo di esecuzione verranno effettuate con il plugin "pitch", considerando che:
- per impostare la tonalità si userà l'omonima proprietà "pitch": il valore di partenza predefinito è 1.0;
- per impostare la velocità del tempo metronomico di esecuzione si userà la proprietà "tempo": il valore di partenza predefinito è 1.0;
- per impostare il volume dell'audio si userà la proprietà "volume": il valore di partenza predefinito è 1.0.
Private pl As MediaPipeline Private pit As MediaControl Private vol As MediaControl Private pitch As Float = 1.00 Private tempo As Float = 1.00 Private volume As Float = 1.00 Private bo As Boolean Public Sub Form_Open() Dim src, par, cnv, res, enc, cnv2, snk As MediaControl Dim flt As MediaFilter pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.wav" par = New MediaControl(pl, "wavparse") cnv = New MediaControl(pl, "audioconvert") res = New MediaControl(pl, "audioresample") flt = New MediaFilter(pl, "audio/x-raw,rate=44100,channels=2") pit = New MediaControl(pl, "pitch") vol = New MediaControl(pl, "volume") cnv2 = New MediaControl(pl, "audioconvert") snk = New MediaControl(pl, "alsasink") src.LinkTo(par) par.LinkTo(cnv) cnv.LinkTo(res) res.LinkTo(flt) flt.LinkTo(pit) pit.LinkTo(cnv2) cnv2.LinkTo(vol) vol.LinkTo(snk) ' Imposta alcuni valori dei due "Slider": With Slider1 .MinValue = 0 .MaxValue = 1000 .Value = 100 End With With Slider2 .MinValue = 0 .MaxValue = 1000 .Value = 100 End With With Slider3 .MinValue = 0 .MaxValue = 1000 .Value = 100 End With End Public Sub Button1_Click() pl.Play() Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) Repeat Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until bo pl.Close() Print "\n\e[0mEsecuzione terminata !" End Public Sub Button2_Click() pl.Stop() pl.Close() ' Consente di arrestare anche il ciclo del conteggio del tempo trascorso: bo = True End Public Sub Slider1_Change() ' Modifica la Tonalità pitch = Slider1.Value / 100 pit["pitch"] = pitch ValueBox1.Value = pitch End Public Sub Slider2_Change() ' Modifica il Tempo metronomico tempo = Slider2.Value / 100 pit["tempo"] = tempo ValueBox2.Value = tempo End Public Sub Slider3_Change() ' Modifica il Volume volume = Slider3.Value / 100 vol["volume"] = volume ' "volume" è una proprietà dell'omonimo plugin "volume" ValueBox3.Value = volume End Public Sub PLine_End() ' Questo Evento viene sollevato, quando l'operazione è terminata bo = True End
Eseguire un file MP3
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim src, map, mad, vol, snk As MediaControl pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.mp3" map = New MediaControl(pl, "mpegaudioparse") mad = New MediaControl(pl, "mpg123audiodec") vol = New MediaControl(pl, "volume") ' <1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100% vol["volume"] = 0.5 snk = New MediaControl(pl, "autoaudiosink") src.LinkTo(map) map.LinkTo(mad) mad.LinkTo(vol) vol.LinkTo(snk) pl.Play() Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) Repeat Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until bo pl.Close Print "\n\e[0mEsecuzione terminata !" End Public Sub PLine_End() ' Questo Evento viene sollevato, quando l'operazione è terminata bo = True End
Eseguire un file OGG
Private bo as Boolean Public Sub Main() Dim pl As MediaPipeline Dim src, dem, vor, vol, snk As MediaControl pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.ogg" dem = New MediaControl(pl, "oggdemux") vor = New MediaControl(pl, "vorbisdec") vol = New MediaControl(pl, "volume") ' <1.0 = volume <100% | 1.0 = volume 100% | >1.0 = volume >100% vol["volume"] = 0.5 snk = New MediaControl(pl, "autoaudiosink") src.LinkTo(dem) dem.LinkLaterTo(vor) vor.LinkTo(vol) vol.LinkTo(snk) pl.Play() Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) Repeat Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until bo pl.Close Write "\nEsecuzione terminata !" End Public Sub PLine_End() bo = True End
Eseguire un file AAC
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim src, dcd, snk As MediaControl pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.aac" dcd = New MediaControl(pl, "faad") snk = New MediaControl(pl, "alsasink") src.LinkTo(dcd) dcd.LinkTo(snk) pl.Play() Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) Repeat Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until bo pl.Close Write "\nEsecuzione terminata !" End Public Sub PLine_End() bo = True End
Eseguire un file FLAC
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim src, fpa, fde, snk As MediaControl pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.flac" fpa = New MediaControl(pl, "flacparse") fde = New MediaControl(pp, "flacdec") snk = New MediaControl(pl, "alsasink") src.LinkTo(fpa) fpa.LinkTo(fde) fde.LinkTo(snk) pl.Play() Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) Repeat Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until bo pl.Close Write "\nEsecuzione terminata !" End Public Sub PLine_End() bo = True End
Estrarre i Tag da un file audio
E' possibile estrarre da un file gli eventuali Metadati mediante l'Evento "_Tag()" della Classe MediaPipeline.
Mostriamo un esempio che prevede l'estrazione dei Tag metadati da un file audio di formato MP3:
Private pl As MediaPipeline Private Meta As New Collection Private ss As New String[] Public Sub ToggleButton1_Click() Dim src, map, mad, snk As MediaControl If ToggleButton1.Value Then TextArea1.Clear pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file/audio" map = New MediaControl(pl, "mpegaudioparse") mad = New MediaControl(pl, "mpg123audiodec") snk = New MediaControl(pl, "autoaudiosink") src.LinkTo(map) map.LinkTo(mad) mad.LinkTo(snk) pl.Play While pl.Duration < 0.1 Wait 0.01 Wend While pl.State == Media.Playing Me.Title = Str(Time(0, 0, 0, pl.Pos * 1000)) Wait 0.1 Wend pl.Close Else pl.Stop pl.Close Endif End Public Sub PLine_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
Estrarre i Tag da un file sito in una pagina web
Mostriamo un esempio pratico:
Private pl As MediaPipeline Private Meta As New Collection Private ss As New String[] Public Sub ToggleButton1_Click() Dim src, map, mad, snk As MediaControl If ToggleButton1.Value Then TextArea1.Clear pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "souphttpsrc") src["location"] = "https://samples-files.com/samples/Audio/mp3/sample-file-1.mp3" map = New MediaControl(pl, "mpegaudioparse") mad = New MediaControl(pl, "mpg123audiodec") snk = New MediaControl(pl, "autoaudiosink") src.LinkTo(map) map.LinkTo(mad) mad.LinkTo(snk) pl.Play While pl.Duration < 0.1 Wait 0.01 Wend While pl.State == Media.Playing Me.Title = Str(Time(0, 0, 0, pl.Pos * 1000)) Wait 0.1 Wend pl.Close Else pl.Stop pl.Close Endif End Public Sub PLine_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
Se si tratta dell'inirizzo web di una radio om-line, allora useremo il decoder decodebin.
Esempio pratico:
Private pl As MediaPipeline Private Meta As New Collection Private ss As New String[] Public Sub ToggleButton1_Click() Dim src, dcb, con, snk As MediaControl If ToggleButton1.Value Then TextArea1.Clear pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "souphttpsrc") src["location"] = "https://giosa.radioca.st/stream" dcb = New MediaControl(pl, "decodebin") con = New MediaControl(pl, "audioconvert") snk = New MediaControl(pl, "autoaudiosink") src.LinkTo(dcb) dcb.LinkLaterTo(con) con.LinkTo(snk) pl.Play While pl.Position < 0.1 Wait 0.01 Wend While pl.State == Media.Playing Me.Title = Str(Time(0, 0, 0, pl.Pos * 1000)) Wait 0.1 Wend pl.Close Else pl.Stop pl.Close Endif End Public Sub PLine_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
Mostrare i plug-in dei visualizzatori grafici 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 pl As MediaPipeline Public Sub ToggleButton1_Click() If ToggleButton1.Value Then Dim DrawingArea1 As DrawingArea Dim src, dcb, tee, que1, que2 As MediaControl Dim vcon, plug, vsnk As MediaControl Dim acon, asnk 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 pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file/audio" dcb = New MediaControl(pl, "decodebin") tee = New MediaControl(pl, "tee") que1 = New MediaControl(pl, "queue") vcon = New MediaControl(pl, "audioconvert") plug = New MediaControl(pl, tipoPlug[6]) plug["style"] = 2 [nota 3] vsnk = New MediaControl(pl, "ximagesink") que2 = New MediaControl(pl, "queue") acon = New MediaControl(pl, "audioconvert") asnk = New MediaControl(pl, "autoaudiosink") src.LinkTo(dcb) dcb.LinkLaterTo(tee) ' Parte video: tee.LinkTo(que1) que1.LinkTo(vcon) vcon.LinkTo(plug) plug.LinkTo(vsnk) ' Parte audio: tee.LinkTo(que2) que2.LinkTo(acon) acon.LinkTo(asnk) ' Si dice al MediaControl di mostrare il proprio output (gli effetti video) in uno specifico controllo GUI, solitamente una DrawingArea: vsnk.SetWindow(DrawingArea1) pl.Play() While (pl.Duration < 0.1) Or (pl.Pos < 0.1) Wait 0.01 Wend Wait pl.Duration Else pl.Stop pl.Close Endif End Public Sub PLine_Position() Me.Title = Str(Time(0, 0, 0, pl.Pos * 1000)) End Public Sub PLine_End() pl.Close ToggleButton1.Value = False End
Interfacciare le Classi MediaControl e MediaPipeline con il plugin "jackaudiosink" di GStreamer per eseguire i file audio
Per eseguire i file audio con le Classi MediaControl e MediaPipeline è 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".
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 esempio di esecuzione di un file wav in un'applicazione a riga di comando:
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim src, prs, cnv, snk As MediaControl pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.wav" prs = New MediaControl(pl, "wavparse") cnv = New MediaControl(pl, "audioconvert") snk = New MediaControl(pl, "jackaudiosink") src.LinkTo(prs) prs.LinkTo(cnv) cnv.LinkTo(snk) pl.Play() Print "\rDurata dell'audio: "; Str(Time(0, 0, 0, pl.Duration * 1000)) Repeat Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until bo pl.Close() Write "\nEsecuzione terminata !" End Public Sub PLine_End() bo = True End
Note
[1] Nel sistema multimediale GStreamer una "Pipeline " è una sequenza di elementi collegati tra loro, e costituisce la struttura su cui si basa GStreamer per processare un flusso multimediale.
Il flusso dati che attraversa la pipeline consiste in una combinazione di buffer ed eventi. Gli eventi contengono informazioni di controllo, come la notifica di ricezione di un metadato, di un comando di seeking (ad esempio permettere in stato di “pause” la pipeline) oppure la fine dello stream (EOS). Il buffer è l’unità base in cui un segnale è suddiviso.
Il segnale viene partizionato in buffer già dal primo elemento che fa da source (sorgente). Dopodiché l’elemento successivo riceve il buffer tramite la sua interfaccia sink-pad, e lo passa all’elemento seguente tramite il suo source-pad, e così via fino all’ultimo elemento che riceverà il buffer.
[2] Per avere contezza di quali siano i plugin ed i filtri da utilizzare, è opportuno vedere sulla rete la documentazione di GStreamer e gli eventuali esempi pratici.
[3] Sullo stile dell'elemento "wavescope" vedere: Stile wavescope