Estrarre e salvare una porzione di dati da un file audio mediante il Componente gb.media
Per estrarre una porzione di dati audio da un file audio e salvarli in un altro file audio mediante le risorse delle Classi MediaPipeline e MediaControl del Componente gb.media, è possibile utilizzare il seguente codice.
Va precisato che è possibile estrarre una parte di dati da un file audio di formato WAV, MP3 e OGG. Tali dati audio, estratti, saranno poi salvati in un nuovo file audio, che potrà essere - a libera scelta dell'utente - di formato WAV, MP3 e OGG, impostando necessariamente la prevista estensione del file nella Costante di tipo stringa: "RISULTATO".
L'utente, altresì, potrà liberamente impostare nelle due ultime Costanti del codice il secondo temporale, da cui estrarre i dati-byte audio del file di origine, e il secondo terminale.
Va precisato altresì che i valori modificabili nel seguente codice sono esclusivamente quelli in rosso.
' Il file audio originario: Private Const ORIGINE As String = "/percorso/del/file/audio/originario" ' Il file contenente la porzione di audio che si otterrà alla fine (bisogna qui impostare la sua estensione): Private Const RISULTATO As String = "/tmp/File_Finale.XXX" ' Il secondo dal quale si inizierà a estrarre la porzione audio dal file originario: Private Const SECONDO_INIZIALE As Integer = 80 ' Il secondo finale della dimensione temporale della porzione audio del file originario: Private Const SECONDO_FINALE As Integer = 121 Public Sub Main() Dim fl As File Dim br, d, i As Integer Dim bb As Byte[] Dim st As Stream ConversioneDa(ORIGINE) fl = Open "/tmp/convertito.wav" For Read ' Legge il Byte-Rate: Seek #fl, 28 Read #fl, br ' Ottiene la durata del file audio di origine e verifica se la durata prescelta della porzione dell'audio è superiore alla durata effettiva dell'audio medesimo: d = Lof(fl) \ br Print "File audio di origine: "; ORIGINE, "- Durata: "; d; " secondi" If SECONDO_FINALE > d Then Error.Raise("Il valore del secondo finale impostato è superiore alla durata dell'audio !") ' Ottiene la quantità di byte della porzione di dati grezzi selezionata sulla base dei secondi iniziali e di quelli finali: d = (br * SECONDO_FINALE) - (SECONDO_INIZIALE * br) Print "\nDurata impostata per il file finale: \e[1m"; d \ br; "\e[0m secondi" bb = New Byte[44 + d] ' Carica il medesimo blocco di intestazione (primi 44 byte) del file "convertito.wav": Seek #fl, 0 bb.Read(fl, 0, 44) st = Memory bb.data For Write ' Ottiene la somma di 36 byte, a cominciare dal al 5° byte (indice 4) del futuro file finale, e della quantità di dati-byte grezzi della porzione da estrarre: i = 36 + d ' Imposta il valore dimensionale di 4 byte a partire dal 5° byte (indice 4) del futuro file finale: Seek #st, 4 Write #st, i As Integer ' Imposta il valore dimensionale di 4 byte a partire dal 41° byte (indice 40) relativo alla quantità dei dati audio grezzi: Seek #st, 40 Write #st, d As Integer st.Close Seek #fl, (SECONDO_INIZIALE * br) bb.Read(fl, 44, d) fl.Close fl = Open "/tmp/porzione.wav" For Create bb.Write(fl, 0, bb.Count) fl.Close ConversioneVerso("/tmp/porzione.wav") End Private Procedure ConversioneDa(s As String) Dim pl As MediaPipeline Dim src, dcb, con, wav, snk As MediaControl Dim appoggio As String Dim i As Integer appoggio = "/tmp/appoggio" pl = New MediaPipeline src = New MediaControl(pl, "filesrc") src["location"] = s dcb = New MediaControl(pl, "decodebin") con = New MediaControl(pl, "audioconvert") wav = New MediaControl(pl, "wavenc") snk = New MediaControl(pl, "filesink") snk["location"] = appoggio src.LinkTo(dcb) dcb.LinkLaterTo(con) con.LinkTo(wav) wav.LinkTo(snk) pl.Play() Repeat i = Stat(appoggio).Size Wait 0.7 Until Stat(appoggio).Size == i s = "/tmp/convertito.wav" If Exist(s) Then Kill s Copy appoggio To s pl.Stop pl.Close End Private Procedure ConversioneVerso(s As String) Dim pl As MediaPipeline Dim src, wav, con, vor, enc, snk As MediaControl Dim appoggio, plugin As String Dim i As Integer appoggio = "/tmp/appoggio" pl = New MediaPipeline src = New MediaControl(pl, "filesrc") src["location"] = s wav = New MediaControl(pl, "wavparse") con = New MediaControl(pl, "audioconvert") vor = New MediaControl(pl, "vorbisenc") ' Imposta il plugin di GStreamer in base al formato del file audio finale che si intende ottenere: Select Right(RISULTATO, 4) Case ".wav" plugin = "wavenc" Case ".mp3" plugin = "lamemp3enc" Case ".ogg" plugin = "oggmux" End Select enc = New MediaControl(pl, plugin) snk = New MediaControl(pl, "filesink") snk["location"] = appoggio src.LinkTo(wav) wav.LinkTo(con) ' Imposta il plugin di GStreamer per la codifica di un file OGG oppure dei file MP3 o WAV: If plugin = "oggmux" Then con.LinkTo(vor) vor.LinkTo(enc) Else con.LinkTo(enc) Endif enc.LinkTo(snk) pl.Play() Repeat i = Stat(appoggio).Size Wait 0.7 Until Stat(appoggio).Size == i If Exist(RISULTATO) Then Kill RISULTATO Copy appoggio To RISULTATO pl.Stop pl.Close End