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 = | + | .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. | + | .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. | + | 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