Estrarre e salvare una porzione di dati da un file audio mediante il Componente gb.media

Da Gambas-it.org - Wikipedia.

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