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 .
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
scusa vuot, ma mi restituisce "not an object":
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
cosi' leggo qualcosa:
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 ....
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:
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:
sudo apt-get install libgstreamer1.0-dev libgstreamer1.0-0
funziona ..... con le librerie esterne
sempre fermo li' ....
e' come se i vlori di peak rms ... fossero di un tipo non supportato:
gb.media: warning: unsupported datatype: GValueArray
gli altri elementi del messaggio .. piu' o meno ci sono:
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:
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 :-(
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:
Shell "jack_connect " & Replace(FirstJackSource, " ", "\\ ") & " " & Destinazione[0]
i due avvisi in successione precedenti lo stop sono:
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:
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()
' 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:
' 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?
...visto che sembra restituire un array di Variant, l'ho assecondato :-\ come segue:
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