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 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
  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 !")
 
   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 = "/tmp/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
     i = Stat(appoggio).Size
+
     Write #File.Out, "\r\e[0mTempo convertito:" & Space(17) &
     Wait 0.7
+
                    "\e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
   Until Stat(appoggio).Size == i
+
    Flush #File.Out
 
+
     Wait 0.01
   s = "/tmp/convertito.wav"
+
   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
 
   
 
   
   appoggio = "/tmp/appoggio"
+
   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
    i = Stat(appoggio).Size
+
     Wait 0.01
     Wait 0.7
+
   Until bo == True
   Until Stat(appoggio).Size == i
+
 
 
 
   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