Differenze tra le versioni di "Estrarre e salvare una porzione di dati da un file audio mediante il Componente gb.media"
Riga 33: | Riga 33: | ||
Read #fl, br | Read #fl, br | ||
− | <FONT Color=gray>' ''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:''</font> | + | <FONT Color=gray>' ''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:''</font> |
d = Lof(fl) \ br | d = Lof(fl) \ br | ||
Riga 39: | Riga 39: | ||
d = (br * SECONDO_FINALE) - (SECONDO_INIZIALE * br) | d = (br * SECONDO_FINALE) - (SECONDO_INIZIALE * br) | ||
If SECONDO_FINALE > d Then Error.Raise("Il valore del secondo finale impostato è superiore alla durata dell'audio !") | If SECONDO_FINALE > d Then Error.Raise("Il valore del secondo finale impostato è superiore alla durata dell'audio !") | ||
+ | |||
bb = New Byte[44 + d] | bb = New Byte[44 + d] | ||
Versione delle 17:59, 15 set 2022
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, OGG e FLAC. Tali dati audio, estratti, saranno poi salvati in un nuovo file audio, che potrà essere - a libera scelta dell'utente - di formato WAV, MP3, OGG o FLAC, 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 presenti nelle dichiarazioni qui delle Costanti..
' 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: wav, mp3, ogg o flac): 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 Dim s As String fl = Open ConversioneDa(ORIGINE, SECONDO_FINALE - SECONDO_INIZIALE) 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 ' 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) If SECONDO_FINALE > d Then Error.Raise("Il valore del secondo finale impostato è superiore alla durata dell'audio !") 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 s = Temp ' Crea un file contenente la «porzione» di dati-byte audio grezzi estratti dal file audio originario: fl = Open s For Create bb.Write(fl, 0, bb.Count) fl.Close ConversioneVerso(s) End Private Function ConversioneDa(s As String, d As Integer) As String Dim pl As MediaPipeline Dim src, dcb, con, wav, snk As MediaControl Dim appoggio As String Dim i As Integer appoggio = Temp pl = New MediaPipeline As "PLine" 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() Print "Durata del file audio di origine: "; Time(0, 0, 0, pl.Duration * 1000) Print "Durata impostata per il file finale: \e[1m"; d; "\e[0m secondi" Repeat Write #File.Out, "\r\e[0mTempo convertito:" & Space(20) & "\e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) Flush #File.Out Wait 0.01 Until bo == True s = Temp If Exist(s) Then Kill s Copy appoggio To s pl.Stop pl.Close Return s 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 bo = False appoggio = Temp pl = New MediaPipeline As "PLine" 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" Case "flac" plugin = "flacenc" 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 Wait 0.01 Until bo == True If Exist(RISULTATO) Then Kill RISULTATO Copy appoggio To RISULTATO pl.Stop pl.Close Print "\n\e[0mOperazione terminata: file «"; RISULTATO; "» creato !" End Public Sub PLine_End() ' Questo Evento viene sollevato, quando l'operazione è terminata bo = True End