Ottenere la forma d'onda di un file audio mediante il Componente gb.media
Mediante opportuni plugin di GStreamer utilizzati con la Classe MediaControl del Componente gb.media unitamente alla Classe MediaPipeline, è possibile ottenere in un file immagine JPEG la forma d'onda di un file audio.
La creazione della forma d'onda dell'audio è gestita dal plugin "wavescope". Questo pluin dispone di una proprietà, chiamata style, che fornisce diversi aspetti della forma d'onda audio a seconda del valore impostato (0 - 3).
Va precisato che il valore del dettaglio "framerate" è composto da una frazione il cui denominatore rappresenta i secondi di durata rappresentati nella/dalla forma d'onda. Pertanto se si vuole ottenere la forma d'onda dell'intero file audio, la frazione da assegnare sarà: 1/durata_del_file_audio_in_secondi.
Il tipo di file immagine va impostato verso la fine al'interno di un oggetto MediaControl mediante apposito plugin, prevedendo nel caso anche il valore della qualità di risoluzione dell'immagine.
Mostriamo di seguito un esempio pratico per ottenere in un file immagine .jpg la forma d'onda di alcuni formati di file audio.
Indice
Ottenere la forma d'onda di un file WAV
Private Const SECONDI As Integer = 5 ' Imposta in secondi la durata dell'onda da disegnare (cominciando dall'inizio dell'audio) Public Sub Main() Dim datigrezzi As String Dim pl As MediaPipeline Dim src, dcd, cnv, scp, jpg, snk As MediaControl Dim flt as MediaFilter datigrezzi = Temp pl = New MediaPipeline src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.wav" ' "location" è una proprietà del plugin "filesrc" dcd = New MediaControl(pl, "wavparse") cnv = New MediaControl(pl, "audioconvert") scp = New MediaControl(pl, "wavescope") scp["style"] = 1 ' "style" è la proprietà del plugin "wavescope", che qui impostiamo a 1 flt = New MediaFilter(pl, "video/x-raw,width=2000,heigth=600,framerate=1" &/ CStr(SECONDI)) jpg = New MediaControl(pl, "jpegenc") jpg["quality"] = 50 ' "quality" è la proprietà del plugin "jpegenc", che qui impostiamo a 50 snk = New MediaControl(pl, "filesink") snk["location"] = datigrezzi ' Collega fra loro all'interno della pipeline gli oggetti MediaControl impostati: src.LinkTo(dcd) dcd.LinkTo(cnv) cnv.LinkTo(scp) scp.LinkTo(flt) flt.LinkTo(jpg) jpg.LinkTo(snk) pl.Play() Wait SECONDI Copy datigrezzi To "/tmp/forma_onda.jpg" pl.Stop() pl.Close() Print "\n\e[0mOperazione terminata !" End
Ottenere la forma d'onda di un file MP3
Private Const SECONDI As Integer = 5 Public Sub Main() Dim datigrezzi As String Dim pl As MediaPipeline Dim src, par, dcd, cnv, scp, jpg, snk As MediaControl Dim flt as MediaFilter datigrezzi = Temp pl = New MediaPipeline src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.mp3" ' "location" è una proprietà del plugin "filesrc" par = New MediaControl(pl, "mpegaudioparse") dcd = New MediaControl(pl, "mpg123audiodec") cnv = New MediaControl(pl, "audioconvert") scp = New MediaControl(pl, "wavescope") scp["style"] = 1 ' "style" è la proprietà del plugin "wavescope", che qui impostiamo a 1 flt = New MediaFilter(pl, "video/x-raw,width=2000,heigth=600,framerate=1" &/ CStr(SECONDI)) jpg = New MediaControl(pl, "jpegenc") jpg["quality"] = 50 ' "quality" è la proprietà del plugin "jpegenc", che qui impostiamo a 50 snk = New MediaControl(pl, "filesink") snk["location"] = datigrezzi src.LinkTo(par) par.LinkTo(dcd) dcd.LinkTo(cnv) cnv.LinkTo(scp) scp.LinkTo(flt) flt.LinkTo(jpg) jpg.LinkTo(snk) pl.Play() Wait SECONDI Copy datigrezzi To "/tmp/forma_onda.jpg" pl.Stop() pl.Close() Print "\n\e[0mOperazione terminata !" End
Ottenere la forma d'onda di un file OGG
Per decodificare un file OGG, ci serviremo del plugin "decodebin".
Private Const SECONDI As Integer = 5 Public Sub Main() Dim datigrezzi As String Dim pl As MediaPipeline Dim src, dcb, cnv, scp, jpg, snk As MediaControl Dim flt as MediaFilter datigrezzi = Temp pl = New MediaPipeline src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.flac" dcb = New MediaControl(pl, "decodebin") cnv = New MediaControl(pl, "audioconvert") scp = New MediaControl(pl, "wavescope") scp["style"] = 1 ' "style" è la proprietà del plugin "wavescope", che qui impostiamo a 1 flt = New MediaFilter(pl, "video/x-raw,width=2000,heigth=600,framerate=1" &/ CStr(SECONDI)) jpg = New MediaControl(pl, "jpegenc") jpg["quality"] = 50 ' "quality" è la proprietà del plugin "jpegenc", che qui impostiamo a 50 snk = New MediaControl(pl, "filesink") snk["location"] = datigrezzi src.LinkTo(dcb) dcb.LinkLaterTo(cnv) cnv.LinkTo(scp) scp.LinkTo(flt) flt.LinkTo(jpg) jpg.LinkTo(snk) pl.Play() Wait SECONDI Copy datigrezzi To "/tmp/forma_onda.jpg" pl.Stop() pl.Close() Print "\n\e[0mOperazione terminata !" End
Ottenere la forma d'onda di un file FLAC
Private Const SECONDI As Integer = 5 Public Sub Main() Dim datigrezzi As String Dim pl As MediaPipeline Dim src, fpa, fde, cnv, scp, jpg, snk As MediaControl Dim flt as MediaFilter datigrezzi = Temp pl = New MediaPipeline src = New MediaControl(pl, "filesrc") src["location"] = "/percorso/del/file.flac" fpa = New MediaControl(pl, "flacparse") fde = New MediaControl(pl, "flacdec") cnv = New MediaControl(pl, "audioconvert") scp = New MediaControl(pl, "wavescope") scp["style"] = 1 ' "style" è la proprietà del plugin "wavescope", che qui impostiamo a 1 flt = New MediaFilter(pl, "video/x-raw,width=2000,heigth=600,framerate=1" &/ CStr(SECONDI)) jpg = New MediaControl(pl, "jpegenc") jpg["quality"] = 50 ' "quality" è la proprietà del plugin "jpegenc", che qui impostiamo a 50 snk = New MediaControl(pl, "filesink") snk["location"] = datigrezzi src.LinkTo(fpa) fpa.LinkTo(fde) fde.LinkTo(cnv) cnv.LinkTo(scp) scp.LinkTo(flt) flt.LinkTo(jpg) jpg.LinkTo(snk) pl.Play() Wait SECONDI Copy datigrezzi To "/tmp/forma_onda.jpg" pl.Stop() pl.Close() Print "\n\e[0mOperazione terminata !" End