Differenze tra le versioni di "Estrarre e salvare una porzione di dati da un file audio mediante il Componente gb.media"
Riga 36: | Riga 36: | ||
<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 | ||
− | |||
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 !") | ||
Riga 79: | Riga 78: | ||
Dim i As Integer | Dim i As Integer | ||
− | appoggio = | + | appoggio = Temp |
− | pl = New MediaPipeline | + | pl = New MediaPipeline As "PLine" |
src = New MediaControl(pl, "filesrc") | src = New MediaControl(pl, "filesrc") | ||
Riga 96: | Riga 95: | ||
con.LinkTo(wav) | con.LinkTo(wav) | ||
wav.LinkTo(snk) | wav.LinkTo(snk) | ||
− | + | ||
pl.Play() | pl.Play() | ||
− | + | ||
+ | Print "Durata del file audio di origine: "; Time(0, 0, 0, pl.Duration * 1000) | ||
Repeat | Repeat | ||
− | + | Write #File.Out, "\r\e[0mTempo convertito:" & Space(17) & | |
− | Wait 0. | + | "\e[31m" & Str(Time(0, 0, 0, pl.Position * 1000)) |
− | Until | + | Flush #File.Out |
− | + | Wait 0.01 | |
− | s = | + | Until bo == True |
− | + | ||
+ | s = Temp | ||
+ | |||
If Exist(s) Then Kill s | If Exist(s) Then Kill s | ||
Copy appoggio To s | Copy appoggio To s | ||
Riga 120: | Riga 122: | ||
Dim i As Integer | Dim i As Integer | ||
− | + | bo = False | |
− | pl = New MediaPipeline | + | appoggio = Temp |
+ | |||
+ | pl = New MediaPipeline As "PLine" | ||
src = New MediaControl(pl, "filesrc") | src = New MediaControl(pl, "filesrc") | ||
Riga 162: | Riga 166: | ||
Repeat | Repeat | ||
− | + | Wait 0.01 | |
− | Wait 0. | + | Until bo == True |
− | Until | + | |
− | |||
If Exist(RISULTATO) Then Kill RISULTATO | If Exist(RISULTATO) Then Kill RISULTATO | ||
Copy appoggio To RISULTATO | Copy appoggio To RISULTATO | ||
Riga 172: | Riga 175: | ||
Print "\nOperazione terminata: file «"; RISULTATO; "» creato !" | Print "\nOperazione terminata: file «"; RISULTATO; "» creato !" | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | '''Public''' Sub PLine_End() <FONT Color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font> | ||
+ | |||
+ | bo = True | ||
'''End''' | '''End''' |
Versione delle 17:07, 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 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 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 = 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) Repeat Write #File.Out, "\r\e[0mTempo convertito:" & Space(17) & "\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 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 "\nOperazione terminata: file «"; RISULTATO; "» creato !" End Public Sub PLine_End() ' Questo Evento viene sollevato, quando l'operazione è terminata bo = True End