Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Da Gambas-it.org - Wikipedia.
Versione del 2 set 2020 alle 06:32 di Vuott (Discussione | contributi)
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.
Mostriamo un semplice codice in ambiente grafico:
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/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