Gambas-it

Programmazione => Progetti degli utenti => Topic aperto da: vuott - 24 Agosto 2017, 06:19:09

Titolo: Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: vuott - 24 Agosto 2017, 06:19:09
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
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: allegfede - 11 Settembre 2017, 12:06:10
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
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: allegfede - 11 Settembre 2017, 13:06:09
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 ....
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: vuott - 11 Settembre 2017, 13:59:48
Ho sollevato quel problema lo scorso mese su Bugtracker:  bug report 1140.
Il problema è stato risolto: devi evidentemente effettuare l'aggiornamento di Gambas.
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: allegfede - 11 Settembre 2017, 15:00:51
che versione hai? io la 3.9.1 .. ma dal repositori gambas-team mi si distrugge tutto apt ...
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: vuott - 11 Settembre 2017, 16:13:02
A me è:

Gambas=3.10.90 1434cb0 (master)

Aggiornamento via GIT con metodo "sotema/Gianluigi".
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: vuott - 11 Settembre 2017, 16:14:47
Questo lo hai provato ?

http://www.gambas-it.org/smf/index.php?topic=5864.0
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: allegfede - 11 Settembre 2017, 16:15:12
passato a 3.10 dal repository lanchpad gambas-team ma nulla da fare ...

Citazione
gb.media: warning: unsupported datatype: GValueArray
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: vuott - 11 Settembre 2017, 16:18:51
Evidentemente non aggiorna.
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: allegfede - 11 Settembre 2017, 16:31:32
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
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: vuott - 11 Settembre 2017, 17:58:37
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 .
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: allegfede - 14 Dicembre 2017, 20:14:21
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 :-(
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: vuott - 14 Dicembre 2017, 22:35:37
Codice: [Seleziona]
gb.media: warning: unsupported datatype: GValueArray
A me questo avviso non viene sollevato.
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: allegfede - 17 Gennaio 2018, 19:31:27
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'

:-(
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: Gianluigi - 17 Gennaio 2018, 22:13:53
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:
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: vuott - 17 Gennaio 2018, 22:59:00
Perché se lo avvio ottengo due avvisi e poi si pianta con out of boud qui:

Credo tu non abbia installato nel sistema il server Jack.
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: vuott - 17 Gennaio 2018, 23:17:39
ma non e' che qualcuno mi da' un occhio a questo programmino:
Dopo aver lanciato Jack Audio Connect, lancio il tuo programma, e anche a me appare il messaggio in finestra: "Jack audio source was not indicated, this could be a problem.".
Chiudo la finestra del messaggio, mi compare il form del programma.
In Jack Audio Connect collego le 2 porte d'uscita del sistem audio con le due porte d'entrata del tuo programma.
Uso un microfono per registrare un suono qualsiasi.
Alla fine premo Stop sul tuo programma, poi chiudo Jack Audio Connect, e vado ad ascoltare il file ogg registrato: tutto regolare.

Si perde tempo però per connettere il tuo programma al sistem audio, poiché devo farlo via Jack Audio Connect.

Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: Gianluigi - 18 Gennaio 2018, 14:44:51
Perché se lo avvio ottengo due avvisi e poi si pianta con out of boud qui:

Credo tu non abbia installato nel sistema il server Jack.

Infatti, avevo capito che mi mancava qualcosa... ma visto che hai già controllato tu  ;D

Grazie della spiegazione  :ok:
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: allegfede - 19 Gennaio 2018, 13:12:30
il programma in teoria riconnette in automatico, ma al primo avvio non ha salvato nulla nei "settings".
Premete l'icona in basso a destra, indicate quale ingresso volete connettere e se e' mono o stereo.

al prossimo avvio iniziera' a registrare in automatico connettendo gli ingressi salvati nei settings.

Pero' se potete verificare per me (a vuott so che funziona,  il codice in pratica e' il suo per quel che riguarda i livelli) che modificando in Public Sub InitCaptureSystem()

Codice: [Seleziona]
' Parte audio SENZA LIVELLI AUDIO:
  Recorder_Client.LinkTo(audioformat)
  audioformat.LinkTo(audio_converter)
  audio_converter.LinkTo(encoder)
  encoder.LinkTo(muxer)
 
  ' 'per cercare di estrarre i livelli dell'audio in ingresso invece:
  ' audio_converter.LinkTo(lev)
  ' lev.LinkTo(encoder)
 
End

in:

Codice: [Seleziona]
' Parte audio SENZA LIVELLI AUDIO:
  Recorder_Client.LinkTo(audioformat)
  audioformat.LinkTo(audio_converter)
  'audio_converter.LinkTo(encoder)
  'encoder.LinkTo(muxer)
 
  ' 'per cercare di estrarre i livelli dell'audio in ingresso invece:
  audio_converter.LinkTo(lev)
  lev.LinkTo(encoder)
  encoder.LinkTo(muxer)

End

vi viene generato un errore sul tipo di dati non supportato?

PS: sembrerebbe che la versione "developing" di gambas abbia risolto il problema, voi che versione avete?
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: Gianluigi - 19 Gennaio 2018, 14:01:07
Ora devo uscire, quando torno se nessun altro ha fatto la prova, mi scarico Jack e provo io, ma ti avverto che anche io come vuott ho la versione sviluppo.

 :ciao:
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: allegfede - 09 Maggio 2018, 18:05:46
un bel ciao a tutti!
come solito, dopo un lungo giro rieccomi ad affrontare un vecchio problema, accantonato per passare a quello nuovo che si presenta giornalemnte :D

oggi ho reinstallato tutto il pc (nuovo disco, nuova vga e nuovo OS) e mi sono detto "non e' che sta volta riesco ad estrarre i dati del vu meter" dai messaggi di gstreamer?

ed eccomi a riesumare un post moribondo :D

in allegato la mia ultima versione del registratore a lunga durata (ricordatevi di installare e lanciare il server audio jack2) e lo screeshot di cosa c'e nel messaggio che ho intercettato.

In teoria qualcosa quel vettore contiene ... ma come lo caccio fuori un "variant"?
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: vuott - 09 Maggio 2018, 23:27:11
...visto che sembra restituire un array di Variant, l'ho assecondato  :-\ come segue:

Codice: [Seleziona]
Public Sub Pipeline_Event(messaggio As MediaMessage)

  Dim vr As Variant[]

   If messaggio.Name = "level" Then
     For b = 0 To messaggio.count - 1
       vr = messaggio["peak"]
       Print vr.Count, vr[0], vr[1]
     Next
   Endif

End
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: allegfede - 14 Maggio 2018, 17:17:13
yes! come sempre VUOTT e' risolutivo ...

con una conversione matematica sui generis, in allegato il registratore in versione beta (sembrerebbe crashare dopo molte registrazioni per "troppi file aperti" ...)

ovviamente tuttal la suite la trovate su sourceforge:
https://sourceforge.net/projects/prsose/files/

grazie della collaborazione
Titolo: Re:Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media
Inserito da: vuott - 14 Maggio 2018, 17:37:37
grazie della collaborazione

...arméno 'nvitace tutti a Terni pe' 'na magnata !

   (https://i.pinimg.com/originals/78/76/b4/7876b4b10192d0023717931968d23f39.gif)