Autore Topic: Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media  (Letto 2691 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.178
  • Ne mors quidem nos iunget
    • Mostra profilo
Il seguente codice consente di analizzare il valore RMS, il picco e il decay dei dati audio di un file WAV, usando il plug-ig "Level " di GStreamer mediante le Classi "MediaPipeline" e "MediaControl" del Componente gb.media .

Codice: [Seleziona]
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/audio"
   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
« Ultima modifica: 07 Ottobre 2020, 18:01:32 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
scusa vuot, ma mi restituisce "not an object":

Codice: [Seleziona]
If Message.Name = "level" Then
     For can = 0 To Message[Message.Keys[5]].count - 1   ' Numero canali

nel debug ho:
gb.media: warning: unsupported datatype: GValueArray
« Ultima modifica: 11 Settembre 2017, 12:09:42 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
cosi' leggo qualcosa:

Codice: [Seleziona]
Public Sub Pipeline_Event(Message As MediaMessage)
   
    If Message.Name = "level" Then
      Debug Message.Key
     
      Debug Message.Keys[0] 'endtime
      Debug Message.Keys[1] 'timestamp
      Debug Message.Keys[2] 'stream-time
      Debug Message.Keys[3] 'running-time
      Debug Message.Keys[4] 'duration
      Debug Message.Keys[5] 'rms
      Debug Message.Keys[6] 'peak
      Debug Message.Keys[7] 'decay
    Endif
   
   
End

ma non riesco a ottenere dati "dentro" ai vari key/keys ....
« Ultima modifica: 11 Settembre 2017, 13:12:20 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.178
  • Ne mors quidem nos iunget
    • Mostra profilo
Ho sollevato quel problema lo scorso mese su Bugtracker:  bug report 1140.
Il problema è stato risolto: devi evidentemente effettuare l'aggiornamento di Gambas.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
che versione hai? io la 3.9.1 .. ma dal repositori gambas-team mi si distrugge tutto apt ...
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.178
  • Ne mors quidem nos iunget
    • Mostra profilo
A me è:

Gambas=3.10.90 1434cb0 (master)

Aggiornamento via GIT con metodo "sotema/Gianluigi".
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.178
  • Ne mors quidem nos iunget
    • Mostra profilo
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
passato a 3.10 dal repository lanchpad gambas-team ma nulla da fare ...

Citazione
gb.media: warning: unsupported datatype: GValueArray
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.178
  • Ne mors quidem nos iunget
    • Mostra profilo
Evidentemente non aggiorna.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Questo lo hai provato ?

http://www.gambas-it.org/smf/index.php?topic=5864.0

si ho modificato questa riga per far analizzare anche file compressi:

Codice: [Seleziona]
lev = gst_parse_launch("filesrc location=" & fileaudio & " ! mad ! audioconvert ! level interval=1000000 ! audio/x-raw,channels=2 ! fakesink", 0)

ma ho dovuto anche installare la libreria condivisa con:
Codice: [Seleziona]
sudo apt-get install libgstreamer1.0-dev libgstreamer1.0-0

funziona ..... con le librerie esterne
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.178
  • Ne mors quidem nos iunget
    • Mostra profilo
ma ho dovuto anche installare la libreria condivisa con:
Codice: [Seleziona]
sudo apt-get install libgstreamer1.0-dev libgstreamer1.0-0

Riprova ora con gb.media .
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
sempre fermo li' ....

e' come se i vlori di peak rms ... fossero di un tipo non supportato:

Codice: [Seleziona]
gb.media: warning: unsupported datatype: GValueArray

gli altri elementi del messaggio .. piu' o meno ci sono:

Citazione
FMain.Pipeline_Event.162: endtime:8800000000
FMain.Pipeline_Event.162: timestamp:8700000000
FMain.Pipeline_Event.162: stream-time:8700000000
FMain.Pipeline_Event.162: running-time:8700000000
FMain.Pipeline_Event.162: duration:100000000

questa e' la procedura che viene triggerata:
Codice: [Seleziona]
Public Sub Pipeline_Event(messaggio As MediaMessage)
Dim b As Byte

  If messaggio.Name = "level" Then
    For b = 0 To messaggio.count - 1
      Select b
        Case 5
          With messaggio
            Debug messaggio[.Keys[b]]
          End With
        Case Else
          With messaggio
            Debug .Keys[b] & ":" & CStr(messaggio[.Keys[b]])
          End With
      End Select
    Next
  Endif

End

tutto aggiornato all'ultima versione :-(
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.178
  • Ne mors quidem nos iunget
    • Mostra profilo
Codice: [Seleziona]
gb.media: warning: unsupported datatype: GValueArray
A me questo avviso non viene sollevato.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
io lo so di essere una rottura di scatole .... ma non e' che qualcuno mi da' un occhio a questo programmino:
http://www.gambas-it.org/smf/index.php?topic=5902.0

e mi dice se abilitando il plug-in "lev" nella procedura InitCaptureSystem riceve dei messaggi d'errore o no nella procedura Pipeline_Event?

Per comodita' lo riallego qui'

:-(
se corri, morirai stanco (motto degli sniper)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.114
  • Tonno verde
    • Mostra profilo
Io di questa roba qua non ne capisco.
Cosa dovrei fare per provarlo?
Perché se lo avvio ottengo due avvisi e poi si pianta con out of boud qui:
Codice: [Seleziona]
Shell "jack_connect " & Replace(FirstJackSource, " ", "\\ ") & " " & Destinazione[0]
i due avvisi in successione precedenti lo stop sono:
Codice: [Seleziona]
Jack audio source was not indicated, this could be a problem. Click on the settings icon!

Error strarting gstreamer graph. Is Jack Audio server runnig?

Ora a nanna (quasi)  :sleepy:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro