Differenze tra le versioni di "Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media"

Da Gambas-it.org - Wikipedia.
 
(3 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
Mediante le Classi "MediaPipeline" e "MediaControl" del Componente gb.media e usando il plug-ig "''Level''" di GStreamer è possibile analizzare il valore RMS, il picco e il decay dei dati audio di un file audio, mentre esso viene eseguito.
 
Mediante le Classi "MediaPipeline" e "MediaControl" del Componente gb.media e usando il plug-ig "''Level''" di GStreamer è possibile analizzare il valore RMS, il picco e il decay dei dati audio di un file audio, mentre esso viene eseguito.
  
Mostriamo un semplice codice in ambiente grafico eseguendo rispettivamente un file WAV, un file Mp3 e un file OGG.
+
 
===Eseguengo un file audio WAV===
+
==Catturando i dati audio digitali provenienti dalla scheda audio==
 +
Mostriamo un codice in ambiente grafico catturando i dati audio provenienti da una sorgente esterna:
 
  Private pl As MediaPipeline
 
  Private pl As MediaPipeline
 
  Private tb As ToggleButton
 
  Private tb As ToggleButton
Riga 32: Riga 33:
 
    
 
    
 
  '''End'''
 
  '''End'''
+
 
 
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
    
 
    
   Dim src, par, con, lev, snk As MediaControl
+
   Dim src, con, lev, snk As MediaControl
 
    
 
    
 
   pl = New MediaPipeline As "Pipeline"
 
   pl = New MediaPipeline As "Pipeline"
 
    
 
    
   src = New MediaControl(pl, "filesrc")
+
   src = New MediaControl(pl, "alsasrc")
  src["location"] = "<FONT Color=gray>''/percorso/del/file.wav''</font>"
 
  par = New MediaControl(pl, "wavparse")
 
 
   con = New MediaControl(pl, "audioconvert")
 
   con = New MediaControl(pl, "audioconvert")
 
   lev = New MediaControl(pl, "level")
 
   lev = New MediaControl(pl, "level")
 
   snk = New MediaControl(pl, "alsasink")
 
   snk = New MediaControl(pl, "alsasink")
   src.LinkTo(par)
+
   src.LinkTo(con)
  par.LinkTo(con)
 
 
   con.LinkTo(lev)
 
   con.LinkTo(lev)
 
   lev.LinkTo(snk)
 
   lev.LinkTo(snk)
 
    
 
    
  '''End'''
+
  '''End'''  
 
 
   
 
   
 
  '''Public''' Sub Tasto_Click()
 
  '''Public''' Sub Tasto_Click()
Riga 65: Riga 61:
 
   Endif
 
   Endif
 
    
 
    
  '''End'''
+
  '''End'''  
 
 
   
 
   
 
  '''Public''' Sub Pipeline_Event(Message As MediaMessage)
 
  '''Public''' Sub Pipeline_Event(Message As MediaMessage)
Riga 76: Riga 71:
 
     For can = 0 To Message[Message.Keys[5]].count - 1  ' Numero canali
 
     For can = 0 To Message[Message.Keys[5]].count - 1  ' Numero canali
 
       gv[0, can].RichText = "&#060;B>Canale " & CStr(can + 1)
 
       gv[0, can].RichText = "&#060;B>Canale " & CStr(can + 1)
       gv[1, can].Text = Message.Keys[0] & "  " & CStr(Date(0, 0, 0, 0, 0, 0, Message[Message.Keys[can]] / 1000000))
+
       gv[1, can].Text = Message.Keys[0] & "  " & CStr(Time(0, 0, 0, Message[Message.Keys[can]] / 1000000))
 
       For b = 5 To Message.count - 1
 
       For b = 5 To Message.count - 1
 
         With Message
 
         With Message
Riga 91: Riga 86:
 
  '''End'''
 
  '''End'''
  
===Eseguendo un file audio MP3===
 
Per utilizzare il precedente codice con un file audio di formato MP3, è sufficiente sostituire un paio di elementi ''MediaControl'' come segue:
 
par = New MediaControl(pl, "<FONT Color=#B22222>mpegaudioparse</font>")
 
con = New MediaControl(pl, "<FONT Color=#B22222>mpg123audiodec</font>")
 
  
===Eseguendo un file audio OGG===
+
==Eseguendo file audio==
Per utilizzare il precedente codice con un file audio di formato OGG, si utilizzerà un codice simile al precedente con qualche variazione:
+
Mostriamo dei codici in ambiente grafico eseguendo rispettivamente un file WAV, un file Mp3 e un file OGG.
 +
 
 +
===Eseguendo un file audio WAV===
 
  Private pl As MediaPipeline
 
  Private pl As MediaPipeline
 +
Private tb As ToggleButton
 
  Private gv As GridView
 
  Private gv As GridView
 
   
 
   
Riga 116: Riga 110:
 
     .Columns.Width = gv.w / 2
 
     .Columns.Width = gv.w / 2
 
     .Rows.Count = 6
 
     .Rows.Count = 6
 +
  End With
 +
  With tb = New ToggleButton(Me) As "Tasto"
 +
    .Y = Me.H * 0.7
 +
    .W = 80
 +
    .H = 40
 +
    .X = (Me.W / 2) - (.W / 2)
 +
    .Text = "Start"
 
   End With
 
   End With
 
    
 
    
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
Riga 129: Riga 129:
 
   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, "oggdemux")
+
   par = New MediaControl(pl, "wavparse")
   con = New MediaControl(pl, "vorbisdec")
+
   con = New MediaControl(pl, "audioconvert")
 
   lev = New MediaControl(pl, "level")
 
   lev = New MediaControl(pl, "level")
 
   snk = New MediaControl(pl, "alsasink")
 
   snk = New MediaControl(pl, "alsasink")
 
   src.LinkTo(par)
 
   src.LinkTo(par)
   par.LinkLaterTo(con)
+
   par.LinkTo(con)
 
   con.LinkTo(lev)
 
   con.LinkTo(lev)
 
   lev.LinkTo(snk)
 
   lev.LinkTo(snk)
 
 
  pl.Play()
 
 
    
 
    
   Wait pl.Duration
+
'''End'''
 +
 +
'''Public''' Sub Tasto_Click()
 +
    
 +
  If tb.Value Then
 +
    pl.Play()
 +
    tb.Text = "Stop"
 +
  Else
 +
    pl.Stop()
 +
    pl.Close()
 +
    Me.Close
 +
  Endif
 +
 
 +
'''End'''
 +
 +
'''Public''' Sub Pipeline_Event(Message As MediaMessage)
 
    
 
    
   pl.Close
+
   Dim can, b As Byte
 +
  Dim rms As Float
 
    
 
    
 +
  If Message.Name = "level" Then
 +
    For can = 0 To Message[Message.Keys[5]].count - 1  <FONT Color=gray>' ''Numero canali''</font>"
 +
      gv[0, can].RichText = "&#060;B>Canale " & CStr(can + 1)
 +
      gv[1, can].Text = Message.Keys[0] & "  " & CStr(Time(0, 0, 0, Message[Message.Keys[can]] / 1000000))
 +
      For b = 5 To Message.count - 1
 +
        With Message
 +
          gv[b - 3, can].Text = CStr(.Keys[b]) & ":  " & CStr(Message[.Keys[b]][can])
 +
        End With
 +
        If b = 5 Then
 +
          rms = (10 ^ (Message[Message.Keys[b]][can] / 20))
 +
          gv[5, can].Text = "Valore rms normalizzato: " & CStr(rms)
 +
        Endif
 +
      Next
 +
    Next
 +
  Endif
 +
     
 
  '''End'''
 
  '''End'''
 +
 +
===Eseguendo un file audio MP3===
 +
Per utilizzare il precedente codice con un file audio di formato MP3, è sufficiente sostituire un paio di elementi ''MediaControl'' come segue:
 +
par = New MediaControl(pl, "<FONT Color=#B22222>mpegaudioparse</font>")
 +
con = New MediaControl(pl, "<FONT Color=#B22222>mpg123audiodec</font>")
 +
 +
===Eseguendo un file audio OGG===
 +
Per utilizzare il precedente codice con un file audio di formato OGG, si utilizzerà un codice simile al precedente con qualche variazione:
 +
Private pl As MediaPipeline
 +
Private gv As GridView
 +
 +
 +
Public Sub _new()
 
    
 
    
 +
  With Me
 +
    .W = 600
 +
    .H = 200
 +
  End With
 +
  With gv = New GridView(Me)
 +
    .X = 10
 +
    .Y = 10
 +
    .W = Me.W - 20
 +
    .H = Me.H * 0.8
 +
    .Columns.Count = 2
 +
    .Columns.Width = gv.w / 2
 +
    .Rows.Count = 6
 +
  End With
 +
 
 +
End
 +
 +
Public Sub Tasto_Click()
 +
 +
  If tb.Value Then
 +
    Dim src, par, con, lev, snk As MediaControl
 +
 +
    pl = New MediaPipeline As "Pipeline"
 +
    src = New MediaControl(pl, "filesrc")
 +
    src["location"] = "<FONT Color=gray>''/percorso/del/file.ogg''</font>"
 +
    par = New MediaControl(pl, "oggdemux")
 +
    con = New MediaControl(pl, "vorbisdec")
 +
    lev = New MediaControl(pl, "level")
 +
    snk = New MediaControl(pl, "alsasink")
 +
    src.LinkTo(par)
 +
    par.LinkLaterTo(con)
 +
    con.LinkTo(lev)
 +
    lev.LinkTo(snk)
 +
 +
    pl.Play()
 +
    Wait pl.Duration
 +
    pl.Close
 
   
 
   
  '''Public''' Sub Pipeline_Event(Message As MediaMessage)
+
  Else
 +
    pl.Stop()
 +
    pl.Close()
 +
    Me.Close
 +
  Endif
 +
 +
End
 +
 +
Public Sub Pipeline_Position()
 +
 +
  Me.Title = "Tempo trascorso: " & Format(pl.Position, "0.00")
 +
 +
End
 +
 +
  Public Sub Pipeline_Event(Message As MediaMessage)
 
    
 
    
 
   Dim can, b As Byte
 
   Dim can, b As Byte
Riga 153: Riga 246:
 
    
 
    
 
   If Message.Name = "level" Then
 
   If Message.Name = "level" Then
     For can = 0 To Message[Message.Keys[5]].count - 1  ' Numero canali
+
     For can = 0 To Message[Message.Keys[5]].count - 1  <FONT Color=gray>' ''Numero canali''</font>"
 
       gv[0, can].RichText = "&#060;B>Canale " & CStr(can + 1)
 
       gv[0, can].RichText = "&#060;B>Canale " & CStr(can + 1)
       gv[1, can].Text = Message.Keys[0] & "  " & CStr(Date(0, 0, 0, 0, 0, 0, Message[Message.Keys[can]] / 1000000))
+
       gv[1, can].Text = Message.Keys[0] & "  " & CStr(Time(0, 0, 0, Message[Message.Keys[can]] / 1000000))
 
       For b = 5 To Message.count - 1
 
       For b = 5 To Message.count - 1
 
         With Message
 
         With Message
Riga 168: Riga 261:
 
   Endif
 
   Endif
 
        
 
        
  '''End'''
+
  End

Versione attuale delle 10:06, 24 mag 2023

Mediante le Classi "MediaPipeline" e "MediaControl" del Componente gb.media e usando il plug-ig "Level" di GStreamer è possibile analizzare il valore RMS, il picco e il decay dei dati audio di un file audio, mentre esso viene eseguito.


Catturando i dati audio digitali provenienti dalla scheda audio

Mostriamo un codice in ambiente grafico catturando i dati audio provenienti da una sorgente esterna:

Private pl As MediaPipeline
Private tb As ToggleButton
Private gv As GridView


Public Sub _new()
 
 With Me
   .W = 600
   .H = 300
 End With
 With gv = New GridView(Me)
   .X = 10
   .Y = 10
   .W = Me.W - 20
   .H = Me.H * 0.6
   .Columns.Count = 2
   .Columns.Width = gv.w / 2
   .Rows.Count = 6
 End With
 With tb = New ToggleButton(Me) As "Tasto"
   .Y = Me.H * 0.7
   .W = 80
   .H = 40
   .X = (Me.W / 2) - (.W / 2)
   .Text = "Start"
 End With
 
End
 
Public Sub Form_Open()
 
 Dim src, con, lev, snk As MediaControl
 
 pl = New MediaPipeline As "Pipeline"
  
 src = New MediaControl(pl, "alsasrc")
 con = New MediaControl(pl, "audioconvert")
 lev = New MediaControl(pl, "level")
 snk = New MediaControl(pl, "alsasink")
 src.LinkTo(con)
 con.LinkTo(lev)
 lev.LinkTo(snk)
 
End 

Public Sub Tasto_Click()
 
 If tb.Value Then
   pl.Play()
   tb.Text = "Stop"
 Else
   pl.Stop()
   pl.Close()
   Me.Close
 Endif
 
End 

Public Sub Pipeline_Event(Message As MediaMessage)
 
 Dim can, b As Byte
 Dim rms As Float
 
 If Message.Name = "level" Then
   For can = 0 To Message[Message.Keys[5]].count - 1   ' Numero canali
     gv[0, can].RichText = "<B>Canale " & CStr(can + 1)
     gv[1, can].Text = Message.Keys[0] & "  " & CStr(Time(0, 0, 0, Message[Message.Keys[can]] / 1000000))
     For b = 5 To Message.count - 1
       With Message
         gv[b - 3, can].Text = CStr(.Keys[b]) & ":  " & CStr(Message[.Keys[b]][can])
       End With
       If b = 5 Then
         rms = (10 ^ (Message[Message.Keys[b]][can] / 20))
         gv[5, can].Text = "Valore rms normalizzato: " & CStr(rms)
       Endif
     Next
   Next
 Endif
     
End


Eseguendo file audio

Mostriamo dei codici in ambiente grafico eseguendo rispettivamente un file WAV, un file Mp3 e un file OGG.

Eseguendo un file audio WAV

Private pl As MediaPipeline
Private tb As ToggleButton
Private gv As GridView


Public Sub _new()
 
 With Me
   .W = 600
   .H = 300
 End With
 With gv = New GridView(Me)
   .X = 10
   .Y = 10
   .W = Me.W - 20
   .H = Me.H * 0.6
   .Columns.Count = 2
   .Columns.Width = gv.w / 2
   .Rows.Count = 6
 End With
 With tb = New ToggleButton(Me) As "Tasto"
   .Y = Me.H * 0.7
   .W = 80
   .H = 40
   .X = (Me.W / 2) - (.W / 2)
   .Text = "Start"
 End With
 
End

Public Sub Form_Open()
 
 Dim src, par, con, lev, snk As MediaControl
 
 pl = New MediaPipeline As "Pipeline"
  
 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file.wav"
 par = New MediaControl(pl, "wavparse")
 con = New MediaControl(pl, "audioconvert")
 lev = New MediaControl(pl, "level")
 snk = New MediaControl(pl, "alsasink")
 src.LinkTo(par)
 par.LinkTo(con)
 con.LinkTo(lev)
 lev.LinkTo(snk)
 
End 

Public Sub Tasto_Click()
 
 If tb.Value Then
   pl.Play()
   tb.Text = "Stop"
 Else
   pl.Stop()
   pl.Close()
   Me.Close
 Endif
 
End 

Public Sub Pipeline_Event(Message As MediaMessage)
 
 Dim can, b As Byte
 Dim rms As Float
 
 If Message.Name = "level" Then
   For can = 0 To Message[Message.Keys[5]].count - 1   ' Numero canali"
     gv[0, can].RichText = "<B>Canale " & CStr(can + 1)
     gv[1, can].Text = Message.Keys[0] & "  " & CStr(Time(0, 0, 0, Message[Message.Keys[can]] / 1000000))
     For b = 5 To Message.count - 1
       With Message
         gv[b - 3, can].Text = CStr(.Keys[b]) & ":  " & CStr(Message[.Keys[b]][can])
       End With
       If b = 5 Then
         rms = (10 ^ (Message[Message.Keys[b]][can] / 20))
         gv[5, can].Text = "Valore rms normalizzato: " & CStr(rms)
       Endif
     Next
   Next
 Endif
     
End

Eseguendo un file audio MP3

Per utilizzare il precedente codice con un file audio di formato MP3, è sufficiente sostituire un paio di elementi MediaControl come segue:

par = New MediaControl(pl, "mpegaudioparse")
con = New MediaControl(pl, "mpg123audiodec")

Eseguendo un file audio OGG

Per utilizzare il precedente codice con un file audio di formato OGG, si utilizzerà un codice simile al precedente con qualche variazione:

Private pl As MediaPipeline
Private gv As GridView


Public Sub _new()
 
 With Me
   .W = 600
   .H = 200
 End With
 With gv = New GridView(Me)
   .X = 10
   .Y = 10
   .W = Me.W - 20
   .H = Me.H * 0.8
   .Columns.Count = 2
   .Columns.Width = gv.w / 2
   .Rows.Count = 6
 End With
 
End 

Public Sub Tasto_Click()

 If tb.Value Then
   Dim src, par, con, lev, snk As MediaControl

   pl = New MediaPipeline As "Pipeline"
   src = New MediaControl(pl, "filesrc")
   src["location"] = "/percorso/del/file.ogg"
   par = New MediaControl(pl, "oggdemux")
   con = New MediaControl(pl, "vorbisdec")
   lev = New MediaControl(pl, "level")
   snk = New MediaControl(pl, "alsasink")
   src.LinkTo(par)
   par.LinkLaterTo(con)
   con.LinkTo(lev)
   lev.LinkTo(snk)

   pl.Play()
   Wait pl.Duration
   pl.Close

 Else
   pl.Stop()
   pl.Close()
   Me.Close
 Endif

End

Public Sub Pipeline_Position()

 Me.Title = "Tempo trascorso: " & Format(pl.Position, "0.00")

End

Public Sub Pipeline_Event(Message As MediaMessage)
 
 Dim can, b As Byte
 Dim rms As Float
 
 If Message.Name = "level" Then
   For can = 0 To Message[Message.Keys[5]].count - 1   ' Numero canali"
     gv[0, can].RichText = "<B>Canale " & CStr(can + 1)
     gv[1, can].Text = Message.Keys[0] & "  " & CStr(Time(0, 0, 0, Message[Message.Keys[can]] / 1000000))
     For b = 5 To Message.count - 1
       With Message
         gv[b - 3, can].Text = CStr(.Keys[b]) & ":  " & CStr(Message[.Keys[b]][can])
       End With
       If b = 5 Then
         rms = (10 ^ (Message[Message.Keys[b]][can] / 20))
         gv[5, can].Text = "Valore rms normalizzato: " & CStr(rms)
       Endif
     Next
   Next
 Endif
     
End