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.
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 WAV, 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:
+
Mostriamo un semplice codice in ambiente grafico eseguendo rispettivamente un file WAV, un file Mp3 e un file OGG.
 +
===Eseguengo un file audio WAV===
 
  Private pl As MediaPipeline
 
  Private pl As MediaPipeline
 
  Private tb As ToggleButton
 
  Private tb As ToggleButton
Riga 66: Riga 67:
 
  '''End'''
 
  '''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(Date(0, 0, 0, 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, "<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 = 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
 +
 
 +
'''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"] = "<FONT Color=gray>''/percorso/del/file.wav''</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
 +
 
 +
'''End'''
 +
 
 
   
 
   
 
  '''Public''' Sub Pipeline_Event(Message As MediaMessage)
 
  '''Public''' Sub Pipeline_Event(Message As MediaMessage)

Versione delle 06:57, 2 set 2020

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

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(Date(0, 0, 0, 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 = 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
 
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, "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
 
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(Date(0, 0, 0, 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