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 106: Riga 106:
 
   With Me
 
   With Me
 
     .W = 600
 
     .W = 600
     .H = 300
+
     .H = 200
 
   End With
 
   End With
 
   With gv = New GridView(Me)
 
   With gv = New GridView(Me)
Riga 112: Riga 112:
 
     .Y = 10
 
     .Y = 10
 
     .W = Me.W - 20
 
     .W = Me.W - 20
     .H = Me.H * 0.6
+
     .H = Me.H * 0.8
 
     .Columns.Count = 2
 
     .Columns.Count = 2
 
     .Columns.Width = gv.w / 2
 
     .Columns.Width = gv.w / 2
Riga 124: Riga 124:
 
    
 
    
 
   Dim src, par, con, lev, snk As MediaControl
 
   Dim src, par, con, lev, snk As MediaControl
 +
 
 +
  Me.Show
 
    
 
    
 
   pl = New MediaPipeline As "Pipeline"
 
   pl = New MediaPipeline As "Pipeline"
 
    
 
    
 
   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.ogg''</font>"
 
   par = New MediaControl(pl, "oggdemux")
 
   par = New MediaControl(pl, "oggdemux")
 
   con = New MediaControl(pl, "vorbisdec")
 
   con = New MediaControl(pl, "vorbisdec")

Versione delle 07:00, 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 = 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 Form_Open()
 
 Dim src, par, con, lev, snk As MediaControl
 
 Me.Show
 
 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
 
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