Differenze tra le versioni di "Estrarre da un file WAV i dati audio grezzi mediante le sole risorse di Gambas"
Da Gambas-it.org - Wikipedia.
Riga 44: | Riga 44: | ||
'''End''' | '''End''' | ||
− | |||
Riga 64: | Riga 63: | ||
Dim datiwav As New INFOWAV | Dim datiwav As New INFOWAV | ||
− | + | datiwav.fileWav = "<FONT Color=gray>''/percorso/del/file.wav''</font>" | |
− | + | EstraeDatiAudio(datiwav) | |
<FONT Color=gray>' ''Mostra in console le informazioni ottenute:</font> | <FONT Color=gray>' ''Mostra in console le informazioni ottenute:</font> | ||
− | + | With datiwav | |
− | + | Print "File wav caricato: "; .fileWAV | |
− | + | Print "Numero dei canali: "; .canali | |
− | + | Print "Frequenza di campionamento: hz "; .frequenza | |
− | + | Print "Risoluzione: "; .bit; " bit" | |
− | + | Print "Durata dell'esecuzione: "; Str(Time(0, 0, 0, .durata * 1000)) | |
− | + | End With | |
'''End''' | '''End''' | ||
Riga 86: | Riga 85: | ||
<FONT Color=gray>' ''Carica il file audio Wav:</font> | <FONT Color=gray>' ''Carica il file audio Wav:</font> | ||
− | + | fl = Open iw.fileWAV For Read | |
<FONT Color=gray>' ''Individua il numero del byte ove è posto il TAG wav "data":''</font> | <FONT Color=gray>' ''Individua il numero del byte ove è posto il TAG wav "data":''</font> | ||
− | + | d = InStr(File.Load(iw.fileWAV), "data") | |
− | + | iw.sonora = New Byte[Lof(fl) - (d + 7)] | |
<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 | |
− | + | <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> | ||
− | + | Seek #fl, 22 | |
− | + | iw.canali = Read #fl As Short | |
<FONT Color=gray>' ''Legge la frequenza di campionamento dei dati audio al byte d'indice (offset) 24:''</font> | <FONT Color=gray>' ''Legge la frequenza di campionamento dei dati audio al byte d'indice (offset) 24:''</font> | ||
− | + | Seek #fl, 24 | |
− | + | iw.frequenza = Read #fl As Integer | |
<FONT Color=gray>' ''Legge il valore del "block align" al byte d'indice (offset) 32:''</font> | <FONT Color=gray>' ''Legge il valore del "block align" al byte d'indice (offset) 32:''</font> | ||
− | + | Seek #fl, 32 | |
− | + | iw.block_align = Read #fl As Short | |
<FONT Color=gray>' ''Legge la risoluzione bit del campionamento al byte d'indice (offset) 34:''</font> | <FONT Color=gray>' ''Legge la risoluzione bit del campionamento al byte d'indice (offset) 34:''</font> | ||
− | + | Seek #fl, 34 | |
− | + | iw.bit = Read #fl As Short | |
<FONT Color=gray>' ''Calcola la durata dell'esecuzione del file wav:''</font> | <FONT Color=gray>' ''Calcola la durata dell'esecuzione del file wav:''</font> | ||
− | + | iw.durata = (iw.sonora.Count / iw.block_align) / iw.frequenza | |
− | + | fl.Close | |
'''End''' | '''End''' |
Versione delle 15:56, 29 giu 2021
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) ' ...oppure anche così: ' dati_grezzi = intero_file[(n + 7), intero_file.Len - (n + 7)] [Nota 1] File.Save("/tmp/grezzi", dati_grezzi) End
Esempio in cui si utilizzano le funzioni dei vettori di tipo Byte[ ]:
Public Sub Main() Dim fileWAV, s As String Dim d As Short Dim bb As Byte[] fileWAV = "/percorso/del/file.wav" ' Carica un file audio Wav: bb = Byte[].FromString(File.Load(fileWAV)) ' Individua la posizione del primo valore della parola "data" nel file wav: d = InStr(File.Load(fileWAV), "data") ' Scrive il file contenente i soli dati audio grezzi del file Wav: File.Save("/tmp/grezzi", bb.ToString(d + 7, bb.Count)) 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 dei canali: "; .canali Print "Frequenza di campionamento: hz "; .frequenza Print "Risoluzione: "; .bit; " bit" Print "Durata dell'esecuzione: "; Str(Time(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
Note
[1] Vedi la seguente pagina: Accedere ai caratteri contenuti da una variabile di tipo stringa come se questa fosse una vettore