Differenze tra le versioni di "Estrarre e salvare una porzione di dati da un file audio mediante il Componente gb.media"

Da Gambas-it.org - Wikipedia.
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