Estrarre e salvare una porzione di dati da un file audio mediante il Componente gb.media
Da Gambas-it.org - Wikipedia.
Versione del 12 set 2022 alle 19:36 di Vuott (Discussione | contributi)
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 estrarrà la porzione audio del 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