Differenze tra le versioni di "Estrarre da un file WAV i soli dati audio grezzi"

Da Gambas-it.org - Wikipedia.
Riga 110: Riga 110:
 
  <FONT Color=gray>' ''Carica nel vettore di tipo Byte[] i soli dati audio grezzi, posti a cominciare dal 7° byte "offset" dopo il primo byte del TAG wav "data":''</font>
 
  <FONT Color=gray>' ''Carica nel vettore di tipo Byte[] i soli dati audio grezzi, posti a cominciare dal 7° byte "offset" dopo il primo byte del TAG wav "data":''</font>
 
   Seek #fl, d + 7
 
   Seek #fl, d + 7
   iw.sonora.Read(fl, 0, Lof(fl) - (d + 7))
+
   <FONT Color=#B22222>iw.sonora.Read(fl, 0, Lof(fl) - (d + 7))</font>
 
   
 
   
 
  <FONT Color=gray>' ''Legge il numero dei canali al byte d'indice (offset) 22:''</font>
 
  <FONT Color=gray>' ''Legge il numero dei canali al byte d'indice (offset) 22:''</font>

Versione delle 09:46, 22 ago 2015

Per estrarre da un file WAV i soli dati audio grezzi unicamente mediante le funzioni di Gambas, è possibile utilizzare vari codici.

Ne mostriamo alcuni:

Public Sub Main()

 Dim percorsoFile, intero_file, dati_grezzi As String
 Dim n As Short


  percorsoFile = "/percorso/del/file.wav"
 
  intero_file = File.Load(percorsoFile)

  n = InStr(intero_file, "data")
  
' Prendiamo i soli dati audio grezzi dal file, eliminando quelli che compongono il suo "header":
  dati_grezzi = Right(intero_file, Len(intero_file) - n - 7)
  
  File.Save("/tmp/grezzi", dati_grezzi)
 
End


Esempio in cui si utilizzano le funzioni dei vettori di tipo Byte[]:

Public Sub Main()

 Dim fileWAV As String
 Dim fl, ex As File
 Dim d As Short
 Dim bb As Byte[]


  fileWAV = "/percorso/del/file.wav"

' Carica un file audio Wav:
  fl = Open fileWAV For Read
 
  d = InStr(File.Load(fileWAV), "data")
 
  bb = New Byte[Stat(fileWAV).Size - (d + 7)]

' Spostiamo il puntatore all'interno del flusso del file
' sul primo byte successivo all'header del file wav:
  Seek #fl, d + 7
  bb.Read(fl, 0, Stat(fileWAV).Size - (d + 7))


  ex = Open "/tmp/dati_grezzi" For Create
 
' Scrive il file contenente i soli dati audio grezzi del file Wav:
  bb.Write(ex)
 

' Va in chiusura:
  ex.Close
 
  fl.Close
 
End


Esempio in cui vengono caricati in un'apposita Struttura alcuni dati del file Wav: numero canali, frequenza di campionamento, risoluzione, block align (quest'ultimo sarà utile per ottenere la durata del brano audio). Tali dati verranno poi mostrati in console ed utilizzati alcuni per calcolare la durata di esecuzione del file Wav:

Public Struct INFOWAV
  fileWAV As String      ' Percorso del file wav
  canali As Short        ' Numero dei canali
  frequenza As Integer   ' Frequenza di campionamento
  bit As Short           ' Risoluzione di campionamento in bit
  block_align As Short   ' Block Align
  durata As Float        ' Durata di esecuzione del file wav
  sonora As Byte[]       ' Dati grezzi del file wav
End Struct


Public Sub Main()

 Dim fileWav As String
 Dim datiwav As New INFOWAV
  
  datiwav.fileWav = "/percorso/del/file.wav"
  
  EstraeDatiAudio(datiwav)
  
' Mostra in console le informazioni ottenute:
  With datiwav
    Print "File wav caricato:";; .fileWAV
    Print "Numero canali:";; .canali
    Print "Frequenza di campionamento: hz";; .frequenza
    Print "Risoluzione:";; .bit;; "bit"
    Print "Durata esecuzione:";; CStr(Date(0, 0, 0, 0, 0, 0, .durata * 1000))
  End With

End


Private Function EstraeDatiAudio(iw As INFOWAV)

 Dim fl As File
 Dim d As Short
 
' Carica il file audio Wav:
  fl = Open iw.fileWAV For Read

' Individua il numero del byte ove è posto il TAG wav "data":
  d = InStr(File.Load(iw.fileWAV), "data")

  iw.sonora = New Byte[Lof(fl) - (d + 7)]
  
' Carica nel vettore di tipo Byte[] i soli dati audio grezzi, posti a cominciare dal 7° byte "offset" dopo il primo byte del TAG wav "data":
  Seek #fl, d + 7
  iw.sonora.Read(fl, 0, Lof(fl) - (d + 7))

' Legge il numero dei canali al byte d'indice (offset) 22:
  Seek #fl, 22
  iw.canali = Read #fl As Short

' Legge la frequenza di campionamento dei dati audio al byte d'indice (offset) 24:
  Seek #fl, 24
  iw.frequenza = Read #fl As Integer

' Legge il valore del "block align" al byte d'indice (offset) 32:
  Seek #fl, 32 
  iw.block_align = Read #fl As Short

' Legge la risoluzione bit del campionamento al byte d'indice (offset) 34:
  Seek #fl, 34 
  iw.bit = Read #fl As Short

' Calcola la durata dell'esecuzione del file wav:
  iw.durata = (iw.sonora.Count / iw.block_align) / iw.frequenza

  fl.Close

End