Differenze tra le versioni di "Eseguire i file audio mediante la Classe ''MediaPipeline'' del componente gb.media"
Riga 65: | Riga 65: | ||
− | + | =Utilizzare i plugin di GStreamer con le Classi ''MediaControl'' e ''MediaPipeline'' per eseguire i file audio= | |
E' possibile eseguire i file audio utilizzando specifici plugin di GStreamer <SUP>[[[#Note|Nota 1]]]</sup> con le Classi ''MediaControl'' e ''MediaPipeline''. | E' possibile eseguire i file audio utilizzando specifici plugin di GStreamer <SUP>[[[#Note|Nota 1]]]</sup> con le Classi ''MediaControl'' e ''MediaPipeline''. | ||
Mostriamo di seguito un paio di esempi per l'esecuzione di file audio. | Mostriamo di seguito un paio di esempi per l'esecuzione di file audio. | ||
− | + | ===Eseguire un file WAV=== | |
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
Riga 207: | Riga 207: | ||
− | + | ===Eseguire un file MP3=== | |
− | + | '''Public''' Sub Main() | |
+ | |||
+ | Dim fileMP3 As String | ||
+ | Dim pl As MediaPipeline | ||
+ | Dim src, map, mad, snk As MediaControl | ||
+ | |||
+ | fileMP3 ="<FONT color=gray>''/percorso/del/file.mp3''</font>" | ||
+ | |||
+ | pl = New MediaPipeline As "MediaP" | ||
+ | |||
+ | src = New MediaControl(pl, "filesrc") | ||
+ | src["location"] = fileMP3 | ||
+ | |||
+ | map = New MediaControl(pl, "mpegaudioparse") | ||
+ | mad = New MediaControl(pl, "mpg123audiodec") | ||
+ | snk = New MediaControl(pl, "alsasink") | ||
+ | src.LinkTo(map) | ||
+ | map.LinkTo(mad) | ||
+ | mad.LinkTo(snk) | ||
+ | |||
+ | pl.Play() | ||
+ | |||
+ | Repeat | ||
+ | Write "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000) | ||
+ | Wait 0.001 | ||
+ | Until pl.Position >= pl.Duration | ||
+ | |||
+ | pl.Stop | ||
+ | pl.Close | ||
+ | <FONT color=#B22222>pl = Null</font> <FONT color=gray>' ''Consente di evitare l'uso della funzione "Quit" per chiudere definitivamente il programma''</font> | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | Qualora (anche per la eccessiva brevità del file MP3) non sia possibile usare la proprietà "''.Duration''" della Classe "''MediaPipeline''", ritornando essa solo il valore zero, per poter uscire alla fine dell'esecuzione del file audio MP3, bisognerà ricavare il valore della durata del file audio attraverso un complesso algoritmo. <SUP>[[[#Note|Nota 2]]]</sup> | ||
Mostriamo di seguito il codice completo: | Mostriamo di seguito il codice completo: | ||
Riga 608: | Riga 642: | ||
pl.Stop | pl.Stop | ||
pl.Close | pl.Close | ||
− | + | pl = Null | |
'''End''' | '''End''' | ||
Riga 620: | Riga 654: | ||
− | + | ===Eseguire un file OGG=== | |
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
Riga 649: | Riga 683: | ||
pl.Stop | pl.Stop | ||
pl.Close | pl.Close | ||
+ | pl = Null | ||
Write "\nEsecuzione terminata !" | Write "\nEsecuzione terminata !" | ||
Riga 655: | Riga 690: | ||
− | + | ===Eseguire un file AAC=== | |
Private pl As MediaPipeline | Private pl As MediaPipeline | ||
Private bo As Boolean | Private bo As Boolean | ||
Riga 698: | Riga 733: | ||
− | + | ===Eseguire un file FLAC=== | |
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
Riga 734: | Riga 769: | ||
− | + | ==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 769: | Riga 804: | ||
'''End''' | '''End''' | ||
− | |||
Versione delle 12:35, 2 ago 2020
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.
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 Dim s As String pl = New MediaPipeline(Null, "playbin") pl["uri"] = Media.URL("/percorso/del/file/audio") pl.Play() ' Utilizziamo la funzione "Input" per consentire l'esecuzione del file audio, evitando così un eccessivo aggravio di lavoro per la CPU. Inoltre, premendo il tasto "Invio" viene interrotta l'esecuzione. Input s pl.Stop pl.Close 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. Per arrestare il ciclo, basterà cliccare sul tasto "Invio" della tastiera, in in questo caso è usato l'Evento "Appication.Read( )".
Private i As Integer Public Sub Main() Dim pl As MediaPipeline Dim mc As MediaControl Dim tm As Date pl = New MediaPipeline mc = New MediaControl(pl, "playbin") mc["uri"] = Media.URL("/percorso/del/file/audio") pl.Play() tm = Now Repeat i = DateDiff(tm, Now, gb.Millisecond) Write "\r" & Date(0, 0, 0, 0, 0, 0, i) Wait 0.001 Until i == -1 pl.Stop pl.Close ' Poiché è stato utilizzato l'Evento "Application.Read()", per chiudere definitivamente il programma è necessario invocare la funzione "Quit": Quit End Public Sub Application_Read() i = -1 End
Indice
Utilizzare i plugin di GStreamer con le Classi MediaControl e MediaPipeline per eseguire i file audio
E' possibile eseguire i file audio utilizzando specifici plugin di GStreamer [Nota 1] con le Classi MediaControl e MediaPipeline.
Mostriamo di seguito un paio di esempi per l'esecuzione di file audio.
Eseguire un file WAV
Public Sub Main() Dim pl As MediaPipeline Dim src, dcd, cnv, snk As MediaControl pl = New MediaPipeline src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.wav" ' "location" è una proprietà del plugin "filesrc" dcd = New MediaControl(pl, "wavparse") cnv = New MediaControl(pl, "audioconvert") snk = New MediaControl(pl, "alsasink") src.LinkTo(dcd) dcd.LinkTo(cnv) cnv.LinkTo(snk) pl.Play() Repeat Write "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000) Wait 0.001 Until pl.Position >= pl.Duration ' La Proprietà ".Duration" è disponibile nell'esecuzione dei file WAV pl.Stop() pl.Close() 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 di esecuzione si userà la proprietà "tempo": 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 Public Sub Form_Open() Dim src, par, cnv, res, enc, cnv2, snk As MediaControl Dim flt As MediaFilter pl = New MediaPipeline 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() Do Write #File.Out, "\rDurata del brano: " & CStr(Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000)) & " - Tempo trascorso: " & CStr(Date(0, 0, 0, 0, 0, 0, pl.Position * 1000)) Wait 0.01 Loop Until (pl.Position >= pl.Duration) ' La Proprietà ".Duration" è disponibile nell'esecuzione dei file WAV End Public Sub Button2_Click() pl.Stop() pl.Close() End Public Sub Slider1_Change() pitch = Slider1.Value / 100 pit["pitch"] = pitch ValueBox1.Value = pitch End Public Sub Slider2_Change() tempo = Slider2.Value / 100 pit["tempo"] = tempo ValueBox2.Value = tempo End Public Sub Slider3_Change() volume = Slider3.Value / 100 vol["volume"] = volume ' "volume" è una proprietà dell'omonimo plugin "volume" ValueBox3.Value = volume End
Eseguire un file MP3
Public Sub Main() Dim fileMP3 As String Dim pl As MediaPipeline Dim src, map, mad, snk As MediaControl fileMP3 ="/percorso/del/file.mp3" pl = New MediaPipeline As "MediaP" src = New MediaControl(pl, "filesrc") src["location"] = fileMP3 map = New MediaControl(pl, "mpegaudioparse") mad = New MediaControl(pl, "mpg123audiodec") snk = New MediaControl(pl, "alsasink") src.LinkTo(map) map.LinkTo(mad) mad.LinkTo(snk) pl.Play() Repeat Write "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000) Wait 0.001 Until pl.Position >= pl.Duration pl.Stop pl.Close pl = Null ' Consente di evitare l'uso della funzione "Quit" per chiudere definitivamente il programma End
Qualora (anche per la eccessiva brevità del file MP3) non sia possibile usare la proprietà ".Duration" della Classe "MediaPipeline", ritornando essa solo il valore zero, per poter uscire alla fine dell'esecuzione del file audio MP3, bisognerà ricavare il valore della durata del file audio attraverso un complesso algoritmo. [Nota 2]
Mostriamo di seguito il codice completo:
Public Sub Main() Dim pl As MediaPipeline Dim src, map, mad, snk As MediaControl Dim fileMP3 As String Dim dur, i As Integer Dim tm As Date fileMP3 = "/percorso/del/file.mp3" pl = New MediaPipeline src = New MediaControl(pl, "filesrc") src["location"] = fileMP3 map = New MediaControl(pl, "mpegaudioparse") mad = New MediaControl(pl, "mpg123audiodec") snk = New MediaControl(pl, "alsasink") src.LinkTo(map) map.LinkTo(mad) mad.LinkTo(snk) pl.Play() ' Invoca la funzione per ottenere la durata del file audio MP3: dur = DurataMP3(fileMP3) tm = Now Repeat i = DateDiff(tm, Now, gb.Millisecond) Write "\rTempo: " & Date(0, 0, 0, 0, 0, 0, i) Wait 0.001 Until i >= dur ' Libera la memoria e va in chiusura: pl.Stop pl.Close Write "\nEsecuzione terminata !" End Private Function DurataMP3(mp3 As String) As Integer Dim s, ver_mp3, layer, prot, medio, circa As String Dim j, frequenza, num_frame, brVar, totBR, durata1, durata2, durata As Integer Dim vB, lB, brB, frB As Byte Dim initium, secundum, tertium, bitrate, cpf As Short Print "File audio mp3: '"; File.Name(mp3) s = File.Load(mp3) Print "\nDimensione: "; Len(s); " byte" initium = 1 For j = initium To Len(s) - 1 If (Asc(s, j) = 255) And (Asc(s, j + 1) > 241) And (Asc(s, j + 2) > 15) Then secundum = Asc(s, j + 1) tertium = Asc(s, j + 2) ' Individua 2° byte dell'header per estrarre le seguenti informazioni generali sul file mp3: ' - vesione MPEG; ' - layer. ' I primi 3 bit più significativi (tutti posti a 1) appartengono con quelli del 1° byte all'identificazione dell'header. ' Viene individuata la versione del file mp3: vB = Asc(s, j + 1) And 24 Select Case vB Case 0 ver_mp3 = "2.5" Case 16 ver_mp3 = "2" Case 24 ver_mp3 = "1" End Select ' Viene individuato il "Layer" del file mp3: lB = Asc(s, j + 1) And 6 Select Case lB Case 2 layer = "III" Case 4 layer = "II" Case 6 layer = "I" End Select Print "Versione MPEG = "; ver_mp3, "Layer = "; layer ' Si analizza, quindi, il terzo byte per estrarre le seguenti informazioni generali sul file mp3: ' - bitrate; ' - frequenza di campionamento; ' Tali informazioni sono condizionate dalla versione e dal layer del file MPEG. brB = Asc(s, j + 2) And 240 bitrate = EstraeBitRate(ver_mp3, layer, brB) frB = Asc(s, j + 2) And 12 frequenza = EstraeFrequenza(ver_mp3, frB) Exit Endif Next For j = 1 To Len(s) - 2 If (Asc(s, j) = 255) And (Asc(s, j + 1) = secundum) Then Inc num_frame If (Asc(s, j) = 255) And (Asc(s, j + 1) = secundum) And (Asc(s, j + 2) <> tertium) Then Inc brVar brB = Asc(s, j + 2) And 240 totBR += EstraeBitRate(ver_mp3, layer, brB) Endif Next ' If brVar > num_frame * 0.1 Then ' Se interessa ottenere il bitrate variabile medio ' Select Case layer ' Case "I" ' cpf = 384 ' Case "II" ' cpf = 1152 ' Case "III" ' If ver_mp3 = "1" Then ' cpf = 1152 ' Else ' cpf = 576 ' Endif ' End Select ' durata1 = Fix((num_frame * cpf / frequenza) * 1000) ' bitrate = totBR / brVar ' durata2 = Fix((Len(s) / bitrate) * 8) ' durata = (durata1 + durata2) / 2 ' medio = "variabile medio " ' circa = "circa " ' Else durata = Fix((Len(s) / bitrate) * 8) ' Endif Print "BitRate " & medio & "= "; bitrate; " kbps" Print "Frequenza = hz "; frequenza Print "Durata " & circa & "= "; Date(0, 0, 0, 0, 0, 0, durata) Return durata End Private Function EstraeBitRate(Vmpeg As String, layB As String, bitB As Byte) As Short Dim velCamp As Short If Vmpeg = "1" Then ' Nel caso di Mpeg vers. 1 Select Case layB ' Verifica il Layer Case "I" Select Case bitB Case 16 velCamp = 32 Case 32 velCamp = 64 Case 48 velCamp = 96 Case 64 velCamp = 128 Case 80 velCamp = 160 Case 96 velCamp = 192 Case 112 velCamp = 224 Case 128 velCamp = 256 Case 144 velCamp = 288 Case 160 velCamp = 320 Case 176 velCamp = 352 Case 192 velCamp = 384 Case 208 velCamp = 416 Case 224 velCamp = 448 End Select Case "II" Select Case bitB Case 16 velCamp = 32 Case 32 velCamp = 48 Case 48 velCamp = 56 Case 64 velCamp = 64 Case 80 velCamp = 80 Case 96 velCamp = 96 Case 112 velCamp = 112 Case 128 velCamp = 128 Case 144 velCamp = 160 Case 160 velCamp = 192 Case 176 velCamp = 224 Case 192 velCamp = 256 Case 208 velCamp = 320 Case 224 velCamp = 384 End Select Case "III" Select Case bitB Case 16 velCamp = 32 Case 32 velCamp = 40 Case 48 velCamp = 48 Case 64 velCamp = 56 Case 80 velCamp = 64 Case 96 velCamp = 80 Case 112 velCamp = 96 Case 128 velCamp = 112 Case 144 velCamp = 128 Case 160 velCamp = 160 Case 176 velCamp = 192 Case 192 velCamp = 224 Case 208 velCamp = 256 Case 224 velCamp = 320 End Select End Select Else Select Case layB ' Verifica il Layer Case "I" Select Case bitB Case 16 velCamp = 32 Case 32 velCamp = 48 Case 48 velCamp = 56 Case 64 velCamp = 64 Case 80 velCamp = 80 Case 96 velCamp = 96 Case 112 velCamp = 112 Case 128 velCamp = 128 Case 144 velCamp = 144 Case 160 velCamp = 160 Case 176 velCamp = 176 Case 192 velCamp = 192 Case 208 velCamp = 224 Case 224 velCamp = 256 End Select Case "II" To "III" Select Case bitB Case 16 velCamp = 8 Case 32 velCamp = 16 Case 48 velCamp = 24 Case 64 velCamp = 32 Case 80 velCamp = 40 Case 96 velCamp = 48 Case 112 velCamp = 56 Case 128 velCamp = 64 Case 144 velCamp = 80 Case 160 velCamp = 96 Case 176 velCamp = 112 Case 192 velCamp = 128 Case 208 velCamp = 144 Case 224 velCamp = 320 End Select End Select Endif Return velCamp End Private Function EstraeFrequenza(Vmpeg As String, fre As Byte) As Integer Dim frq As Integer Select Case Vmpeg Case "1" ' Nel caso di Mpeg vers. 1 Select Case fre Case 0 frq = 44100 Case 4 frq = 48000 Case 8 frq = 32000 End Select Case "2" ' Nel caso di Mpeg vers. 2 Select Case fre Case 0 frq = 22050 Case 4 frq = 24000 Case 8 frq = 16000 End Select Case "2.5" ' Nel caso di Mpeg vers. 2.5 Select Case fre Case 0 frq = 11025 Case 4 frq = 12000 Case 8 frq = 8000 End Select End Select Return frq End
Un'alternativa è quella di usare l'Evento "_End( )" della Classe "MediaPipeline", inserendo nella sua routine l'assegnazione di un valore in una variabile per far uscire l'esecuzione del codice dal ciclo che consente di mostrare il tempo trascorso dall'inizio del processo audio del file mp3.
Private pl As MediaPipeline Private bo As Boolean Public Sub Main() Dim fileMP3 As String Dim src, map, mad, snk As MediaControl Dim tm As Date pl = New MediaPipeline As "MediaP" fileMP3 ="/percorso/del/file.mp3" src = New MediaControl(pl, "filesrc") src["location"] = fileMP3 map = New MediaControl(pl, "mpegaudioparse") mad = New MediaControl(pl, "mpg123audiodec") snk = New MediaControl(pl, "alsasink") src.LinkTo(map) map.LinkTo(mad) mad.LinkTo(snk) pl.Play() tm = Now Repeat Write "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000) Wait 0.001 Until bo == True pl.Stop pl.Close pl = Null End Public Sub MediaP_End() bo = True End
Eseguire un file OGG
Public Sub Main() Dim pl As MediaPipeline Dim src, dem, vor, snk As MediaControl pl = New MediaPipeline As "PL" src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.ogg" dem = New MediaControl(pl, "oggdemux") vor = New MediaControl(pp, "vorbisdec") snk = New MediaControl(pl, "alsasink") src.LinkTo(dem) dem.LinkTo(vor) vor.LinkTo(snk) pl.Play() Repeat Write #File.Out, "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000) Flush #File.Out Wait 0.01 Until pl.Position >= pl.Duration ' La Proprietà ".Duration" è disponibile nell'esecuzione dei file OGG pl.Stop pl.Close pl = Null Write "\nEsecuzione terminata !" End
Eseguire un file AAC
Private pl As MediaPipeline Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim src, dcd, snk As MediaControl pl = New MediaPipeline As "PL" 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() Repeat Write #File.Out, "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000) Flush #File.Out Wait 0.01 Until bo = True pl.Stop pl.Close Write "\nEsecuzione terminata !" End Public Sub PL_End() bo = True End
Eseguire un file FLAC
Public Sub Main() Dim pl As MediaPipeline Dim src, fpa, fde, snk As MediaControl pl = New MediaPipeline src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.flac" ' "location" è una proprietà del plugin "filesrc" 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() Repeat Write #File.Out, "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000) Flush #File.Out Wait 0.01 Until pl.Position >= pl.Duration ' La Proprietà ".Duration" è disponibile nell'esecuzione dei file FLAC pl.Stop pl.Close Write "\nEsecuzione terminata !" 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:
Public Sub Main() Dim pl As MediaPipeline Dim src, prs, cnv, snk As MediaControl pl = New MediaPipeline src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.wav" ' "location" è una proprietà del plugin "filesrc" 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 "\nDurata: " & Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000) Wait pl.Duration pl.Stop() pl.Close() End
Note
[1] 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.
[2] Si segnalano come riferimento le seguenti pagine della Wiki: