Differenze tra le versioni di "Duplicare il flusso dei dati audio di una pipeline della Classe ''MediaPipeline'' del componente gb.media"

Da Gambas-it.org - Wikipedia.
 
(5 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
Duplicando il flusso dei dati audio di un Oggetto ''pipeline'' della Classe ''MediaPipeline'' del componente ''gb.media'', si ottiene una sorta di ramificazione del flusso che consente di gestire ciascun flusso di dati audio in modo del tutto autonomo.
 
Duplicando il flusso dei dati audio di un Oggetto ''pipeline'' della Classe ''MediaPipeline'' del componente ''gb.media'', si ottiene una sorta di ramificazione del flusso che consente di gestire ciascun flusso di dati audio in modo del tutto autonomo.
  
La duplicazione del flusso audio principale è compiuta con l'elemento "''Tee''".
+
La duplicazione del flusso audio principale è compiuta con l'elemento "<FONT Color=#B22222>Tee</font>".
  
 
Vediamo di seguito un esempio pratico utilizzando un file audio di tipo WAV. In questo esempio le due ramificazioni del flusso di dati audio resteranno indipendenti sino alla fine, ossia sino al loro invio all'elemento di riproduzione audio.
 
Vediamo di seguito un esempio pratico utilizzando un file audio di tipo WAV. In questo esempio le due ramificazioni del flusso di dati audio resteranno indipendenti sino alla fine, ossia sino al loro invio all'elemento di riproduzione audio.
  '''Public''' Sub Main()
+
  Private bo As Boolean
 +
 +
 +
Public Sub Main()
 
   
 
   
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
 
   Dim src, tee, que As MediaControl
 
   Dim src, tee, que As MediaControl
   Dim vor, cnv, res, pan, vol, snk As MediaControl
+
   Dim vor, cnv, res, pan, vol As MediaControl
   Dim vor2, cnv2, res2, pan2, pit, snk2 As MediaControl
+
   Dim vor2, cnv2, res2, pan2, pit As MediaControl
 +
  Dim mix, 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=gray>''/percorso/del/file/audio.wav''</font>"
+
   src["location"] = "<FONT Color=darkgreen>''/percorso/del/file/audio.wav''</font>"
 
   <FONT Color=#B22222>tee</font> = New MediaControl(pl, "<FONT Color=#B22222>'''tee'''</font>")
 
   <FONT Color=#B22222>tee</font> = New MediaControl(pl, "<FONT Color=#B22222>'''tee'''</font>")
 
   que = New MediaControl(pl, "queue")
 
   que = New MediaControl(pl, "queue")
Riga 25: Riga 29:
 
   vol = New MediaControl(pl, "volume")
 
   vol = New MediaControl(pl, "volume")
 
   vol["volume"] = 0.5
 
   vol["volume"] = 0.5
  snk = New MediaControl(pl, "autoaudiosink")
+
 
 
 
   vor2 = New MediaControl(pl, "wavparse")
 
   vor2 = New MediaControl(pl, "wavparse")
 
   cnv2 = New MediaControl(pl, "audioconvert")
 
   cnv2 = New MediaControl(pl, "audioconvert")
Riga 34: Riga 37:
 
   pit = New MediaControl(pl, "pitch")
 
   pit = New MediaControl(pl, "pitch")
 
   pit["pitch"] = 0.8
 
   pit["pitch"] = 0.8
   snk2 = New MediaControl(pl, "autoaudiosink")
+
 
+
   mix = New MediaControl(pl, "audiomixer")
 +
  snk = New MediaControl(pl, "autoaudiosink")
 +
 
  <FONT Color=gray>' ''Il flusso dei dati audio viene diviso in due rami:''</font>
 
  <FONT Color=gray>' ''Il flusso dei dati audio viene diviso in due rami:''</font>
 
   src.LinkTo(<FONT Color=#B22222>tee</font>)
 
   src.LinkTo(<FONT Color=#B22222>tee</font>)
 
+
 
  <FONT Color=gray>' ''1° ramo dei dati audio:''</font>
 
  <FONT Color=gray>' ''1° ramo dei dati audio:''</font>
 
   <FONT Color=#B22222>tee</font>.LinkTo(que)
 
   <FONT Color=#B22222>tee</font>.LinkTo(que)
Riga 46: Riga 51:
 
   res.LinkTo(pan)
 
   res.LinkTo(pan)
 
   pan.LinkTo(vol)
 
   pan.LinkTo(vol)
   vol.LinkTo(snk)
+
   vol.LinkTo(mix)
 
+
 
  <FONT Color=gray>' ''2° ramo dei dati audio:''</font>
 
  <FONT Color=gray>' ''2° ramo dei dati audio:''</font>
 
   <FONT Color=#B22222>tee</font>.LinkTo(vor2)
 
   <FONT Color=#B22222>tee</font>.LinkTo(vor2)
Riga 54: Riga 59:
 
   res2.LinkTo(pan2)
 
   res2.LinkTo(pan2)
 
   pan2.LinkTo(pit)
 
   pan2.LinkTo(pit)
   pit.LinkTo(snk2)
+
   pit.LinkTo(mix)
 
+
 +
<FONT Color=gray>' ''Unisce i due flussi audio e invia il flusso al sistema audio:''</font>
 +
  mix.LinkTo(snk)
 +
 
   pl.Play()
 
   pl.Play()
     
+
   While pl.Duration > pl.Position
+
   While pl.Duration < 1
    Write "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000)
+
     Wait 0.01
     Wait 0.001
 
 
   Wend
 
   Wend
    
+
  Print "La durata del file audio è: "; Time(0, 0, 0, pl.Duration * 1000)
 +
  Repeat
 +
    Write "\rTempo Trascorso: " & Time(0, 0, 0, pl.Position * 1000)
 +
    Wait 0.01
 +
  Until bo
 +
 +
  pl.Stop()
 +
  pl.Close()
 +
 +
End
 +
 +
 +
Public Sub PLine_End()
 +
 +
  bo = True
 +
 +
End
 +
Usando invece il plugin "decodebin" per gestire un qualsiasi file audio:
 +
Private bo As Boolean
 +
 +
 +
Public Sub Main()
 +
 +
  Dim pl As MediaPipeline
 +
  Dim src, tee, que, que2 As MediaControl
 +
  Dim vor, cnv, res, pan, vol As MediaControl
 +
  Dim cnv2, res2, pan2, pit As MediaControl
 +
  Dim mix, snk As MediaControl
 +
 +
  pl = New MediaPipeline As "PLine"
 +
 +
  src = New MediaControl(pl, "filesrc")
 +
  src["location"] = "<FONT Color=darkgreen>''/percorso/del/file/audio''</font>"
 +
  tee = New MediaControl(pl, "tee")
 +
  que = New MediaControl(pl, "queue")
 +
  vor = New MediaControl(pl, "decodebin")
 +
  cnv = New MediaControl(pl, "audioconvert")
 +
  res = New MediaControl(pl, "audioresample")
 +
  pan = New MediaControl(pl, "audiopanorama")
 +
  pan["panorama"] = 1.00  ' Pan a destra
 +
  vol = New MediaControl(pl, "volume")
 +
  vol["volume"] = 0.5
 +
 +
  que2 = New MediaControl(pl, "queue")
 +
  cnv2 = New MediaControl(pl, "audioconvert")
 +
  res2 = New MediaControl(pl, "audioresample")
 +
  pan2 = New MediaControl(pl, "audiopanorama")
 +
  pan2["panorama"] = -1.00  ' Pan a sinistra
 +
  pit = New MediaControl(pl, "pitch")
 +
  pit["pitch"] = 0.8
 +
 +
  mix = New MediaControl(pl, "audiomixer")
 +
  snk = New MediaControl(pl, "autoaudiosink")
 +
 +
  src.LinkTo(vor)
 +
<FONT Color=gray>' ''Il flusso dei dati audio viene diviso in due rami:''</font>
 +
  vor.LinkLaterTo(tee)
 +
<FONT Color=gray>' ''1° ramo dei dati audio:''</font>
 +
  tee.LinkTo(que)
 +
  que.LinkTo(cnv)
 +
  cnv.LinkTo(res)
 +
  res.LinkTo(pan)
 +
  pan.LinkTo(vol)
 +
  vol.LinkTo(mix)
 +
 +
<FONT Color=gray>' ''1° ramo dei dati audio:''</font>
 +
  tee.LinkTo(que2)
 +
  que2.LinkTo(cnv2)
 +
  cnv2.LinkTo(res2)
 +
  res2.LinkTo(pan2)
 +
  pan2.LinkTo(pit)
 +
  pit.LinkTo(mix)
 +
 +
<FONT Color=gray>' ''Unisce i due flussi audio e invia il flusso al sistema audio:''</font>
 +
  mix.LinkTo(snk)
 +
 +
   pl.Play()
 +
 +
  While pl.Duration < 1
 +
    Wait 0.01
 +
  Wend
 +
  Print "La durata del file audio è: "; Time(0, 0, 0, pl.Duration * 1000)
 +
  Repeat
 +
    Write "\rTempo Trascorso: " & Time(0, 0, 0, pl.Position * 1000)
 +
    Wait 0.01
 +
  Until bo
 +
 
   pl.Stop()
 
   pl.Stop()
 
   pl.Close()
 
   pl.Close()
 
+
  '''End'''
+
End
 +
 +
 +
Public Sub PLine_End()
 +
 +
  bo = True
 +
 +
  End

Versione attuale delle 10:40, 6 nov 2023

Duplicando il flusso dei dati audio di un Oggetto pipeline della Classe MediaPipeline del componente gb.media, si ottiene una sorta di ramificazione del flusso che consente di gestire ciascun flusso di dati audio in modo del tutto autonomo.

La duplicazione del flusso audio principale è compiuta con l'elemento "Tee".

Vediamo di seguito un esempio pratico utilizzando un file audio di tipo WAV. In questo esempio le due ramificazioni del flusso di dati audio resteranno indipendenti sino alla fine, ossia sino al loro invio all'elemento di riproduzione audio.

Private bo As Boolean


Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, tee, que As MediaControl
 Dim vor, cnv, res, pan, vol As MediaControl
 Dim vor2, cnv2, res2, pan2, pit As MediaControl
 Dim mix, snk As MediaControl
 
 pl = New MediaPipeline As "PLine"
  
 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file/audio.wav"
 tee = New MediaControl(pl, "tee")
 que = New MediaControl(pl, "queue")
 
 vor = New MediaControl(pl, "wavparse")
 cnv = New MediaControl(pl, "audioconvert")
 res = New MediaControl(pl, "audioresample")
 pan = New MediaControl(pl, "audiopanorama")
 pan["panorama"] = 1.00   ' Pan a destra
 vol = New MediaControl(pl, "volume")
 vol["volume"] = 0.5

 vor2 = New MediaControl(pl, "wavparse")
 cnv2 = New MediaControl(pl, "audioconvert")
 res2 = New MediaControl(pl, "audioresample")
 pan2 = New MediaControl(pl, "audiopanorama")
 pan2["panorama"] = -1.00   ' Pan a sinistra
 pit = New MediaControl(pl, "pitch")
 pit["pitch"] = 0.8

 mix = New MediaControl(pl, "audiomixer")
 snk = New MediaControl(pl, "autoaudiosink")

' Il flusso dei dati audio viene diviso in due rami:
 src.LinkTo(tee)

' 1° ramo dei dati audio:
 tee.LinkTo(que)
 que.LinkTo(vor)
 vor.LinkTo(cnv)
 cnv.LinkTo(res)
 res.LinkTo(pan)
 pan.LinkTo(vol)
 vol.LinkTo(mix)

' 2° ramo dei dati audio:
 tee.LinkTo(vor2)
 vor2.LinkTo(cnv2)
 cnv2.LinkTo(res2)
 res2.LinkTo(pan2)
 pan2.LinkTo(pit)
 pit.LinkTo(mix)

' Unisce i due flussi audio e invia il flusso al sistema audio:
 mix.LinkTo(snk)

 pl.Play()

 While pl.Duration < 1
   Wait 0.01
 Wend
 Print "La durata del file audio è: "; Time(0, 0, 0, pl.Duration * 1000)
 Repeat 
   Write "\rTempo Trascorso: " & Time(0, 0, 0, pl.Position * 1000)
   Wait 0.01
 Until bo

 pl.Stop()
 pl.Close()

End


Public Sub PLine_End()

 bo = True

End

Usando invece il plugin "decodebin" per gestire un qualsiasi file audio:

Private bo As Boolean


Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, tee, que, que2 As MediaControl
 Dim vor, cnv, res, pan, vol As MediaControl
 Dim cnv2, res2, pan2, pit As MediaControl
 Dim mix, snk As MediaControl

 pl = New MediaPipeline As "PLine"

 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file/audio"
 tee = New MediaControl(pl, "tee")
 que = New MediaControl(pl, "queue")
 vor = New MediaControl(pl, "decodebin")
 cnv = New MediaControl(pl, "audioconvert")
 res = New MediaControl(pl, "audioresample")
 pan = New MediaControl(pl, "audiopanorama")
 pan["panorama"] = 1.00   ' Pan a destra
 vol = New MediaControl(pl, "volume")
 vol["volume"] = 0.5

 que2 = New MediaControl(pl, "queue")
 cnv2 = New MediaControl(pl, "audioconvert")
 res2 = New MediaControl(pl, "audioresample")
 pan2 = New MediaControl(pl, "audiopanorama")
 pan2["panorama"] = -1.00   ' Pan a sinistra
 pit = New MediaControl(pl, "pitch")
 pit["pitch"] = 0.8

 mix = New MediaControl(pl, "audiomixer")
 snk = New MediaControl(pl, "autoaudiosink")

 src.LinkTo(vor)
' Il flusso dei dati audio viene diviso in due rami:
 vor.LinkLaterTo(tee)
' 1° ramo dei dati audio:
 tee.LinkTo(que)
 que.LinkTo(cnv)
 cnv.LinkTo(res)
 res.LinkTo(pan)
 pan.LinkTo(vol)
 vol.LinkTo(mix)

' 1° ramo dei dati audio:
 tee.LinkTo(que2)
 que2.LinkTo(cnv2)
 cnv2.LinkTo(res2)
 res2.LinkTo(pan2)
 pan2.LinkTo(pit)
 pit.LinkTo(mix)

' Unisce i due flussi audio e invia il flusso al sistema audio:
 mix.LinkTo(snk)

  pl.Play()

 While pl.Duration < 1
   Wait 0.01
 Wend
 Print "La durata del file audio è: "; Time(0, 0, 0, pl.Duration * 1000)
 Repeat 
   Write "\rTempo Trascorso: " & Time(0, 0, 0, pl.Position * 1000)
   Wait 0.01
 Until bo

 pl.Stop()
 pl.Close()

End


Public Sub PLine_End()

 bo = True

End