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.
 
(18 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
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.
 
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 e OGG. Tali dati audio, estratti, saranno poi salvati in un nuovo file audio, che potrà essere - a libera scelta dell'utente - di formato WAV, MP3 e OGG, impostando necessariamente la prevista estensione del file nella Costante di tipo stringa: "RISULTATO".
+
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.
 
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 <SPAN Style="text-decoration:underline>esclusivamente</span> quelli in rosso.
+
Va precisato altresì che i valori modificabili nel seguente codice sono <SPAN Style="text-decoration:underline>esclusivamente</span> quelli in rosso presenti nelle dichiarazioni qui delle Costanti..
 
  <FONT Color=gray>' ''Il file audio originario:''</font>
 
  <FONT Color=gray>' ''Il file audio originario:''</font>
 
  Private Const ORIGINE As String = "<FONT Color=#B22222>''/percorso/del/file/audio/originario''</font>"
 
  Private Const ORIGINE As String = "<FONT Color=#B22222>''/percorso/del/file/audio/originario''</font>"
 
   
 
   
  <FONT Color=gray>' ''Il file contenente la porzione di audio che si otterrà alla fine (bisogna qui impostare la sua estensione):''</font>
+
  <FONT Color=gray>' ''Il file contenente la porzione di audio che si otterrà alla fine ('''bisogna qui impostare la sua estensione: wav, mp3, ogg o flac'''):''</font>
 
  Private Const RISULTATO As String = "/tmp/File_Finale.<FONT Color=#B22222><B>XXX</b></font>"
 
  Private Const RISULTATO As String = "/tmp/File_Finale.<FONT Color=#B22222><B>XXX</b></font>"
 
   
 
   
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()
+
   
 +
Public Sub Main()
 
   
 
   
 
   Dim fl As File
 
   Dim fl As File
Riga 25: Riga 27:
 
   Dim bb As Byte[]
 
   Dim bb As Byte[]
 
   Dim st As Stream
 
   Dim st As Stream
 +
  Dim s As String
 
   
 
   
   ConversioneDa(ORIGINE)
+
   fl = Open ConversioneDa(ORIGINE) For Read
 
  fl = Open "/tmp/convertito.wav" For Read
 
 
   
 
   
 
  <FONT Color=gray>' ''Legge il Byte-Rate:''</font>
 
  <FONT Color=gray>' ''Legge il Byte-Rate:''</font>
Riga 34: Riga 35:
 
   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
  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 !")
 +
  Write "\rFile audio di origine: " & ORIGINE & "  -  Durata: " & CStr(d) & " secondi"
 
   
 
   
 
  <FONT Color=gray>' ''Ottiene la quantità di byte della porzione di dati grezzi selezionata sulla base dei secondi iniziali e di quelli finali:''</font>
 
  <FONT Color=gray>' ''Ottiene la quantità di byte della porzione di dati grezzi selezionata sulla base dei secondi iniziali e di quelli finali:''</font>
 
   d = (br * SECONDO_FINALE) - (SECONDO_INIZIALE * br)
 
   d = (br * SECONDO_FINALE) - (SECONDO_INIZIALE * br)
   Print "\nDurata impostata per il file finale: \e[1m"; d \ br; "\e[0m secondi"
+
   Print "\n\nDurata impostata per il file finale: \e[1m"; d \ br; "\e[0m secondi\n"
 +
 
   bb = New Byte[44 + d]
 
   bb = New Byte[44 + d]
 
   
 
   
Riga 63: Riga 65:
 
   fl.Close
 
   fl.Close
 
   
 
   
   fl = Open "/tmp/porzione.wav" For Create  
+
  s = Temp
 +
 +
<FONT Color=gray>' ''Crea un file contenente la «porzione» di dati-byte audio grezzi estratti dal file audio originario:''</font>
 +
   fl = Open s For Create  
 
   
 
   
 
   bb.Write(fl, 0, bb.Count)
 
   bb.Write(fl, 0, bb.Count)
 
   fl.Close
 
   fl.Close
 
   
 
   
   ConversioneVerso("/tmp/porzione.wav")
+
   ConversioneVerso(s)
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Private''' Procedure ConversioneDa(s As String)
+
   
 +
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 appoggio As String
+
   Dim temporaneo As String
  Dim i As Integer
+
 
+
   temporaneo = Temp
   appoggio = "/tmp/appoggio"
 
 
    
 
    
   pl = New MediaPipeline  
+
   pl = New MediaPipeline As "PLine"
 
    
 
    
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
Riga 90: Riga 95:
 
   wav = New MediaControl(pl, "wavenc")
 
   wav = New MediaControl(pl, "wavenc")
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
   snk["location"] = appoggio
+
   snk["location"] = temporaneo
 
    
 
    
 
   src.LinkTo(dcb)
 
   src.LinkTo(dcb)
Riga 96: Riga 101:
 
   con.LinkTo(wav)
 
   con.LinkTo(wav)
 
   wav.LinkTo(snk)
 
   wav.LinkTo(snk)
 
+
 
   pl.Play()
 
   pl.Play()
 
+
 
   Repeat
 
   Repeat
     i = Stat(appoggio).Size
+
     Write "\r\e[31m\e[5mAttendere: 1ª conversione in corso !\e[0m"
     Wait 0.7
+
     Wait 0.01
   Until Stat(appoggio).Size == i
+
   Until bo == True
 
+
   s = "/tmp/convertito.wav"
+
   s = Temp
 
+
 
   If Exist(s) Then Kill s
 
   If Exist(s) Then Kill s
   Copy appoggio To s
+
   Copy temporaneo To s
 
   pl.Stop
 
   pl.Stop
 
   pl.Close
 
   pl.Close
 
   
 
   
  '''End'''
+
  Return s
 +
 +
  End
 
   
 
   
  '''Private''' Procedure ConversioneVerso(s As String)
+
   
 +
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 appoggio, plugin As String
+
   Dim plugin As String
  Dim i As Integer
 
 
   
 
   
   appoggio = "/tmp/appoggio"
+
   bo = False
 
   
 
   
   pl = New MediaPipeline  
+
   pl = New MediaPipeline As "PLine"
 
    
 
    
 
   src = New MediaControl(pl, "filesrc")
 
   src = New MediaControl(pl, "filesrc")
Riga 132: 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 Right(RISULTATO, 4)
+
   Select File.Ext(RISULTATO)
     Case ".wav"
+
     Case "wav"
 
       plugin = "wavenc"
 
       plugin = "wavenc"
     Case ".mp3"
+
     Case "mp3"
 
       plugin = "lamemp3enc"
 
       plugin = "lamemp3enc"
     Case ".ogg"
+
     Case "ogg"
 
       plugin = "oggmux"
 
       plugin = "oggmux"
 +
    Case "flac"
 +
      plugin = "flacenc"
 
   End Select
 
   End Select
 
   
 
   
 
   enc = New MediaControl(pl, plugin)
 
   enc = New MediaControl(pl, plugin)
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
   snk["location"] = appoggio
+
   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 WAV:''</font>
+
  <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 160: Riga 169:
 
    
 
    
 
   Repeat
 
   Repeat
     i = Stat(appoggio).Size
+
     Write "\r\e[31m\e[5mAttendere: 2ª conversione in corso !\e[0m"
     Wait 0.7
+
     Wait 0.01
   Until Stat(appoggio).Size == i
+
   Until bo == True
 
+
  If Exist(RISULTATO) Then Kill RISULTATO
 
  Copy appoggio To RISULTATO
 
 
   pl.Stop
 
   pl.Stop
 
   pl.Close
 
   pl.Close
 
   
 
   
  '''End'''
+
  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
 +
 +
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