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 187: Riga 187:
 
   
 
   
 
   
 
   
  '''Public''' Sub _new()
+
  Public Sub _new()
 
    
 
    
 
   With Me
 
   With Me
Riga 203: Riga 203:
 
   End With
 
   End With
 
    
 
    
  '''End'''
+
  End  
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Tasto_Click()
    
+
  Dim src, par, con, lev, snk As MediaControl
+
   If tb.Value Then
 
+
    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["location"] = "<FONT Color=gray>''/percorso/del/file.ogg''</font>"
  src = New MediaControl(pl, "filesrc")
+
    par = New MediaControl(pl, "oggdemux")
  src["location"] = "<FONT Color=gray>''/percorso/del/file.ogg''</font>"
+
    con = New MediaControl(pl, "vorbisdec")
  par = New MediaControl(pl, "oggdemux")
+
    lev = New MediaControl(pl, "level")
  con = New MediaControl(pl, "vorbisdec")
+
    snk = New MediaControl(pl, "alsasink")
  lev = New MediaControl(pl, "level")
+
    src.LinkTo(par)
  snk = New MediaControl(pl, "alsasink")
+
    par.LinkLaterTo(con)
  src.LinkTo(par)
+
    con.LinkTo(lev)
  par.LinkLaterTo(con)
+
    lev.LinkTo(snk)
  con.LinkTo(lev)
+
  lev.LinkTo(snk)
+
    pl.Play()
 
+
    Wait pl.Duration
  pl.Play()
+
    pl.Close
 
+
  Wait pl.Duration
+
   Else
    
+
    pl.Stop()
  pl.Close
+
    pl.Close()
    
+
    Me.Close
  '''End'''  
+
   Endif
 +
 +
  End
 +
 +
Public Sub Pipeline_Position()
 +
 +
  Me.Title = "Tempo trascorso: " & Format(pl.Position, "0.00")
 +
 +
  End
 
   
 
   
  '''Public''' Sub Pipeline_Event(Message As MediaMessage)
+
  Public Sub Pipeline_Event(Message As MediaMessage)
 
    
 
    
 
   Dim can, b As Byte
 
   Dim can, b As Byte
Riga 253: Riga 261:
 
   Endif
 
   Endif
 
        
 
        
  '''End'''
+
  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.


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