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.
(2 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 | + | |
− | + | ==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 | + | Dim src, con, lev, snk As MediaControl |
pl = New MediaPipeline As "Pipeline" | pl = New MediaPipeline As "Pipeline" | ||
− | src = New MediaControl(pl, " | + | src = New MediaControl(pl, "alsasrc") |
− | |||
− | |||
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 | + | src.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 = "<B>Canale " & CStr(can + 1) | gv[0, can].RichText = "<B>Canale " & CStr(can + 1) | ||
− | gv[1, can].Text = Message.Keys[0] & " " & CStr( | + | 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 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 pl As MediaPipeline | ||
+ | Private tb As ToggleButton | ||
Private gv As GridView | Private gv As GridView | ||
Riga 106: | Riga 100: | ||
With Me | With Me | ||
.W = 600 | .W = 600 | ||
− | .H = | + | .H = 300 |
End With | End With | ||
With gv = New GridView(Me) | With gv = New GridView(Me) | ||
Riga 112: | Riga 106: | ||
.Y = 10 | .Y = 10 | ||
.W = Me.W - 20 | .W = Me.W - 20 | ||
− | .H = Me.H * 0. | + | .H = Me.H * 0.6 |
.Columns.Count = 2 | .Columns.Count = 2 | ||
.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() | ||
Dim src, par, con, lev, snk As MediaControl | Dim src, par, con, lev, snk As MediaControl | ||
− | |||
− | |||
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.wav''</font>" |
− | par = New MediaControl(pl, " | + | par = New MediaControl(pl, "wavparse") |
− | con = New MediaControl(pl, " | + | 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. | + | par.LinkTo(con) |
con.LinkTo(lev) | con.LinkTo(lev) | ||
lev.LinkTo(snk) | 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 <FONT Color=gray>' ''Numero canali''</font>" | ||
+ | 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''' | '''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 | ||
+ | |||
+ | 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 155: | 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 = "<B>Canale " & CStr(can + 1) | gv[0, can].RichText = "<B>Canale " & CStr(can + 1) | ||
− | gv[1, can].Text = Message.Keys[0] & " " & CStr( | + | 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 170: | Riga 261: | ||
Endif | Endif | ||
− | + | 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.
Indice
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