Differenze tra le versioni di "Estrarre e salvare una porzione di dati da un file audio mediante il Componente gb.media"
(3 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 18: | Riga 18: | ||
Private Const SECONDO_FINALE As Integer = <FONT Color=#B22222>121</font> | Private Const SECONDO_FINALE As Integer = <FONT Color=#B22222>121</font> | ||
+ | Private bo As Boolean | ||
− | + | ||
+ | Public Sub Main() | ||
Dim fl As File | Dim fl As File | ||
Riga 73: | Riga 75: | ||
ConversioneVerso(s) | ConversioneVerso(s) | ||
− | + | End | |
− | + | ||
+ | Private Function ConversioneDa(s As String) As String | ||
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
Dim src, dcb, con, wav, snk As MediaControl | Dim src, dcb, con, wav, snk As MediaControl | ||
− | Dim | + | Dim temporaneo As String |
− | + | temporaneo = Temp | |
pl = New MediaPipeline As "PLine" | pl = New MediaPipeline As "PLine" | ||
Riga 92: | Riga 95: | ||
wav = New MediaControl(pl, "wavenc") | wav = New MediaControl(pl, "wavenc") | ||
snk = New MediaControl(pl, "filesink") | snk = New MediaControl(pl, "filesink") | ||
− | snk["location"] = | + | snk["location"] = temporaneo |
src.LinkTo(dcb) | src.LinkTo(dcb) | ||
Riga 102: | Riga 105: | ||
Repeat | Repeat | ||
− | Write "\r\e[ | + | Write "\r\e[31m\e[5mAttendere: 1ª conversione in corso !\e[0m" |
Wait 0.01 | Wait 0.01 | ||
Until bo == True | Until bo == True | ||
Riga 109: | Riga 112: | ||
If Exist(s) Then Kill s | If Exist(s) Then Kill s | ||
− | Copy | + | Copy temporaneo To s |
pl.Stop | pl.Stop | ||
pl.Close | pl.Close | ||
Riga 115: | Riga 118: | ||
Return s | Return s | ||
− | + | End | |
− | + | ||
+ | Private Procedure ConversioneVerso(s As String) | ||
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
Dim src, wav, con, vor, enc, snk As MediaControl | Dim src, wav, con, vor, enc, snk As MediaControl | ||
− | Dim | + | Dim plugin As String |
− | |||
bo = False | bo = False | ||
− | |||
− | |||
pl = New MediaPipeline As "PLine" | pl = New MediaPipeline As "PLine" | ||
Riga 138: | Riga 139: | ||
<FONT Color=gray>' ''Imposta il plugin di GStreamer in base al formato del file audio finale che si intende ottenere:''</font> | <FONT Color=gray>' ''Imposta il plugin di GStreamer in base al formato del file audio finale che si intende ottenere:''</font> | ||
− | Select | + | Select File.Ext(RISULTATO) |
− | Case " | + | Case "wav" |
plugin = "wavenc" | plugin = "wavenc" | ||
− | Case " | + | Case "mp3" |
plugin = "lamemp3enc" | plugin = "lamemp3enc" | ||
− | Case " | + | Case "ogg" |
plugin = "oggmux" | plugin = "oggmux" | ||
Case "flac" | Case "flac" | ||
Riga 151: | Riga 152: | ||
enc = New MediaControl(pl, plugin) | enc = New MediaControl(pl, plugin) | ||
snk = New MediaControl(pl, "filesink") | snk = New MediaControl(pl, "filesink") | ||
− | snk["location"] = | + | snk["location"] = RISULTATO |
src.LinkTo(wav) | src.LinkTo(wav) | ||
wav.LinkTo(con) | wav.LinkTo(con) | ||
− | <FONT Color=gray>' ''Imposta il plugin di GStreamer per la codifica di un file OGG oppure dei file MP3 o | + | <FONT Color=gray>' ''Imposta il plugin di GStreamer per la codifica di un file OGG oppure dei file MP3, WAV o FLAC:''</font> |
If plugin = "oggmux" Then | If plugin = "oggmux" Then | ||
con.LinkTo(vor) | con.LinkTo(vor) | ||
Riga 168: | Riga 169: | ||
Repeat | Repeat | ||
− | Write "\r\e[ | + | Write "\r\e[31m\e[5mAttendere: 2ª conversione in corso !\e[0m" |
Wait 0.01 | Wait 0.01 | ||
Until bo == True | Until bo == True | ||
− | |||
− | |||
pl.Stop | pl.Stop | ||
pl.Close | pl.Close | ||
Riga 179: | Riga 178: | ||
Write "\r\e[0mOperazione terminata: file «" & RISULTATO & "» creato !" | Write "\r\e[0mOperazione terminata: file «" & RISULTATO & "» creato !" | ||
− | + | End | |
+ | |||
− | + | Public Sub PLine_End() <FONT Color=gray>' ''Questo Evento viene sollevato, quando l'operazione è terminata''</font> | |
bo = True | bo = True | ||
− | + | End |
Versione attuale delle 17:57, 17 gen 2024
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 Private bo As Boolean 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) 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 !") Write "\rFile audio di origine: " & ORIGINE & " - Durata: " & CStr(d) & " secondi" ' 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 "\n\nDurata impostata per il file finale: \e[1m"; d \ br; "\e[0m secondi\n" 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) As String Dim pl As MediaPipeline Dim src, dcb, con, wav, snk As MediaControl Dim temporaneo As String temporaneo = 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"] = temporaneo src.LinkTo(dcb) dcb.LinkLaterTo(con) con.LinkTo(wav) wav.LinkTo(snk) pl.Play() Repeat Write "\r\e[31m\e[5mAttendere: 1ª conversione in corso !\e[0m" Wait 0.01 Until bo == True s = Temp If Exist(s) Then Kill s Copy temporaneo 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 plugin As String bo = False 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 File.Ext(RISULTATO) 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"] = RISULTATO src.LinkTo(wav) wav.LinkTo(con) ' Imposta il plugin di GStreamer per la codifica di un file OGG oppure dei file MP3, WAV o FLAC: If plugin = "oggmux" Then con.LinkTo(vor) vor.LinkTo(enc) Else con.LinkTo(enc) Endif enc.LinkTo(snk) pl.Play() Repeat Write "\r\e[31m\e[5mAttendere: 2ª conversione in corso !\e[0m" Wait 0.01 Until bo == True pl.Stop pl.Close Write "\r\e[0mOperazione terminata: file «" & RISULTATO & "» creato !" End Public Sub PLine_End() ' Questo Evento viene sollevato, quando l'operazione è terminata bo = True End