Differenze tra le versioni di "Eseguire i file audio mediante la Classe ''MediaPipeline'' del componente gb.media"

Da Gambas-it.org - Wikipedia.
Riga 13: Riga 13:
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
 
    
 
    
   pl = New MediaPipeline(Null, "playbin") As "PLine"
+
   pl = New MediaPipeline(Null, "<FONT color=#B22222>playbin</font>") As "PLine"
 
   pl["uri"] = Media.URL("<FONT color=gray>''/percorso/del/file/audio''</font>")
 
   pl["uri"] = Media.URL("<FONT color=gray>''/percorso/del/file/audio''</font>")
 
   
 
   
Riga 48: Riga 48:
 
   pl = New MediaPipeline As "PLine"
 
   pl = New MediaPipeline As "PLine"
 
    
 
    
   mc = New MediaControl(pl, "playbin")
+
   mc = New MediaControl(pl, "<FONT color=#B22222>playbin</font>")
 
   mc["uri"] = Media.URL("<FONT color=gray>''/percorso/del/file/audio''</font>")
 
   mc["uri"] = Media.URL("<FONT color=gray>''/percorso/del/file/audio''</font>")
 
    
 
    
Riga 72: Riga 72:
  
 
=Usare la Classe "MediaPipeline" con il decoder "decodebin" di GStreamer=
 
=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":
 
Mostriamo un esempio pratico a "riga di comando":
 
  Private bo As Boolean
 
  Private bo As Boolean
Riga 79: Riga 81:
 
   
 
   
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
   Dim src, dcb, con, snk As MediaControl
+
   Dim src, dcb, con, vol, snk As MediaControl
 
   
 
   
 
   pl = New MediaPipeline As "PLine"
 
   pl = New MediaPipeline As "PLine"
Riga 86: Riga 88:
 
   src["location"] = "<FONT color=gray>''/percorso/del/file/audio''</font>"
 
   src["location"] = "<FONT color=gray>''/percorso/del/file/audio''</font>"
 
   
 
   
   dcb = New MediaControl(pl, "decodebin")
+
   dcb = New MediaControl(pl, "<FONT color=#B22222>decodebin</font>")
 
   con = New MediaControl(pl, "audioconvert")
 
   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")
 
   snk = New MediaControl(pl, "autoaudiosink")
 
   
 
   
 
   src.LinkTo(dcb)
 
   src.LinkTo(dcb)
   dcb.LinkLaterTo(con)
+
   con.LinkTo(vol)
   con.LinkTo(snk)
+
   vol.LinkTo(snk)
 
   
 
   
 
   pl.Play()
 
   pl.Play()
Riga 115: Riga 119:
  
 
Mostriamo di seguito alcuni esempi per l'esecuzione di file audio.
 
Mostriamo di seguito alcuni esempi per l'esecuzione di file audio.
 
===Eseguire file audio di vari formati===
 
In questo caso si utlizzerà il plug-in "decodebin".
 
Private bo As Boolean
 
 
 
'''Public''' Sub Main()
 
 
  Dim pl As MediaPipeline
 
  Dim src,bin, con, ask As MediaControl
 
  Dim fileaudio As String
 
 
  fileaudio = "<FONT color=gray>''/percorso/del/file/audio''</font>"
 
 
  pl = New MediaPipeline As "PLine"
 
 
  src = New MediaControl(pl, "filesrc")
 
  src["location"] = fileaudio
 
 
  bin = New MediaControl(pl, "decodebin")
 
  con = New MediaControl(pl, "audioconvert")
 
  ask = New MediaControl(pl, "autoaudiosink")
 
 
  src.LinkTo(bin)
 
  bin.LinkLaterTo(con)
 
  con.LinkTo(ask)
 
 
  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.Stop
 
  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 WAV===
 
===Eseguire un file WAV===
Riga 172: Riga 128:
 
   
 
   
 
   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"
 
   pl = New MediaPipeline As "PLine"
 
   
 
   
   src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>")
+
   src = New MediaControl(pl, "filesrc")
   src["location"] = "<FONT color=gray>''/percorso/del/file.wav''</font>"   <FONT color=gray>' ''"location" è una proprietà del plugin "filesrc"''</font>
+
   src["location"] = "<FONT color=gray>''/percorso/del/file.wav''</font>"
 
   
 
   
 
   dcd = New MediaControl(pl, "<FONT color=#B22222>wavparse</font>")
 
   dcd = New MediaControl(pl, "<FONT color=#B22222>wavparse</font>")
   cnv = New MediaControl(pl, "<FONT color=#B22222>audioconvert</font>")
+
   cnv = New MediaControl(pl, "audioconvert")
   snk = New MediaControl(pl, "<FONT color=#B22222>alsasink</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, "alsasink")
 
   src.LinkTo(dcd)
 
   src.LinkTo(dcd)
 
   dcd.LinkTo(cnv)
 
   dcd.LinkTo(cnv)
   cnv.LinkTo(snk)
+
   cnv.LinkTo(vol)
 +
  vol.LinkTo(snk)
 
   
 
   
 
   pl.Play()
 
   pl.Play()
Riga 194: Riga 153:
 
   Until bo
 
   Until bo
 
   
 
   
  pl.Stop()
 
 
   pl.Close()
 
   pl.Close()
 
   
 
   
Riga 229: Riga 187:
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
 
   src["location"] = "<FONT color=gray>''/percorso/del/file.wav''</font>"
 
   src["location"] = "<FONT color=gray>''/percorso/del/file.wav''</font>"
   par = New MediaControl(pl, "wavparse")
+
   par = New MediaControl(pl, "<FONT color=#B22222>wavparse</font>")
 
   cnv = New MediaControl(pl, "audioconvert")
 
   cnv = New MediaControl(pl, "audioconvert")
 
   res = New MediaControl(pl, "audioresample")
 
   res = New MediaControl(pl, "audioresample")
Riga 337: Riga 295:
 
   src["location"] = "<FONT color=gray>''/percorso/del/file.mp3''</font>"
 
   src["location"] = "<FONT color=gray>''/percorso/del/file.mp3''</font>"
 
    
 
    
   map = New MediaControl(pl, "mpegaudioparse")
+
   map = New MediaControl(pl, "<FONT color=#B22222>mpegaudioparse</font>")
   mad = New MediaControl(pl, "mpg123audiodec")
+
   mad = New MediaControl(pl, "<FONT color=#B22222>mpg123audiodec</font>")
 
   snk = New MediaControl(pl, "alsasink")
 
   snk = New MediaControl(pl, "alsasink")
 
   src.LinkTo(map)
 
   src.LinkTo(map)
Riga 352: Riga 310:
 
   Until bo
 
   Until bo
 
   
 
   
  pl.Stop
 
 
   pl.Close
 
   pl.Close
 
   
 
   
Riga 393: Riga 350:
 
   Until bo
 
   Until bo
 
   
 
   
  pl.Stop
 
 
   pl.Close
 
   pl.Close
 
    
 
    
Riga 434: Riga 390:
 
   Until bo
 
   Until bo
 
   
 
   
  pl.Stop
 
 
   pl.Close
 
   pl.Close
 
   
 
   
Riga 478: Riga 433:
 
   Until bo
 
   Until bo
 
   
 
   
  pl.Stop
 
 
   pl.Close
 
   pl.Close
 
   
 
   
Riga 529: Riga 483:
 
   Until bo
 
   Until bo
 
   
 
   
  pl.Stop()
 
 
   pl.Close()
 
   pl.Close()
 
   
 
   

Versione delle 02:40, 16 apr 2023

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]

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)
 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()
 Print "\n\e[0mEsecuzione terminata !"

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, 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")
 snk = New MediaControl(pl, "alsasink")
 src.LinkTo(map)
 map.LinkTo(mad)
 mad.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

Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, dem, vor, 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")
 snk = New MediaControl(pl, "alsasink")

 src.LinkTo(dem)
 dem.LinkLaterTo(vor)
 vor.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


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.