Differenze tra le versioni di "Estrarre informazioni da un file .wav"
Riga 30: | Riga 30: | ||
==Estrazione delle informazioni con le funzioni esterne del API di SOX== | ==Estrazione delle informazioni con le funzioni esterne del API di SOX== | ||
+ | La libreria '''''[http://sox.sourceforge.net/ Sox]''''' contiene risorse per poter gestire ampiamente i file audio: riproduzione e registrazione, conversione di vari formati audio in altri formati, nonché applicare vari effetti. | ||
+ | Le risorse del API di ''Sox'' consentono anche di ottenere facilmente varie informazioni dai file audio, richiamando l'attuale versione della libreria: libsox.so.2.0.1 | ||
+ | |||
+ | Potremo procedere con un codice simile al seguente: | ||
+ | '''Public''' Struct sox_signalinfo_t | ||
+ | rate As Float <FONT color=gray>' ''sox_rate_t: samples per second, 0 if unknown (typedef double sox_rate_t)''</font> | ||
+ | channels As Integer <FONT color=gray>' ''number of sound channels, 0 if unknown''</font> | ||
+ | precision As Integer <FONT color=gray>' ''bits per sample, 0 if unknown''</font> | ||
+ | length As Long <FONT color=gray>' ''samples * chans in file, 0 if unknown, -1 if unspecified (typedef unsigned long sox_uint64_t;)''</font> | ||
+ | mult As Pointer <FONT color=gray>' ''Effects headroom multiplier; may be null''</font> | ||
+ | '''End''' Struct | ||
+ | |||
+ | '''Public''' Struct sox_format_t | ||
+ | filename As Pointer | ||
+ | signal As Struct Sox_signalinfo_t | ||
+ | '''End''' Struct | ||
+ | |||
+ | '''Private''' sfIn As New Sox_format_t | ||
+ | |||
+ | |||
+ | Library "libsox:2.0.1" | ||
+ | |||
+ | '''Private''' Const SOX_SUCCESS As Byte = 0 | ||
+ | |||
+ | <FONT color=gray>' ''int sox_init(void)'' | ||
+ | ' ''Client API: Initialize effects library. SOX_SUCCESS if successful.''</font> | ||
+ | '''Private''' Extern sox_init() As Integer | ||
+ | |||
+ | <FONT color=gray>' ''sox_format_t * sox_open_read(char const *path, sox_signalinfo_t const *signal, sox_encodinginfo_t const *encoding, char const *filetype)''</font> | ||
+ | '''Private''' Extern sox_open_read(path As String, signalP As Pointer, encoding As Pointer, filetype As String) As Sox_format_t | ||
+ | |||
+ | |||
+ | '''Public''' Sub Main() | ||
+ | |||
+ | Dim err As Integer | ||
+ | Dim fileWAV As String | ||
+ | |||
+ | |||
+ | fileWAV = "''/percorso/del/file.wav''" | ||
+ | |||
+ | err = sox_init() | ||
+ | If err <> SOX_SUCCESS Then Error.Raise("Impossibile inizializzare la libreria 'libsox' !") | ||
+ | |||
+ | sfIn = sox_open_read(fileWAV, Null, Null, Null) | ||
+ | |||
+ | With sfIn | ||
+ | Print "File audio: "; String@(.filename) | ||
+ | Print "Frequenza di campionamento: hrz "; .signal.rate | ||
+ | Print "Numero di canali: "; .signal.channels | ||
+ | Print "Risoluzione campionamento: "; .signal.precision; " bit" | ||
+ | Print "Dimensione dei soli dati grezzi del file wav: "; .signal.length * .signal.channels; " byte" <FONT color=gray>' ''(il secondo valore è privo dei byte del blocco di intestazione del file wav = 44 byte)''</font> | ||
+ | End With | ||
+ | |||
+ | '''End''' | ||
− | |||
Versione delle 15:45, 8 gen 2014
Il file .wav è un sottotipo del file RIFF.
Le informazioni generali di un file WAVE sono contenute nei primi 44 byte del file medesimo.
Il file WAVE è sostanzialmente composto da un solo blocco (chunk), a sua volta composto da due sottoblocchi: il primo blocco, appunto, formato da 44 byte contiene - come già detto - le informazioni relative alle caratteristiche del file; il secondo blocco contiene i dati audio veri e propri della forma d'onda digitalizzata.
Indice
Estrazione delle informazioni con le sole funzioni Gambas
Volendo estrarre le informazioni più importanti relative ad un file WAV mediante le sole risorse interne di Gambas, andremo a leggere alcuni byte spcifici appartenenti al primo sotto-blocco. Bisogna sottolineare che i le informzioni sono espresse all'interno del primo sotto-blocco in modalità little-endian. |1|
Frequenza di campionamento
Le informazioni relative alla frequenza di campionamento del file WAV sono contenute nel 25°, 26° e 27° byte.
Risoluzione del campionamento
Le informazioni relative alla risoluzione in bit del campionamento del file WAV sono contenute nel 17° e 18° byte.
Numero di canali
Le informazioni relative al numero di canali del file WAV sono contenute nel 23° e 24° byte.
La lunghezza del file
I file WAV contiene immediatamente dopo il primo sotto-blocco iniziale quattro byte che indicano la quantità di byte contenuta dal secondo sotto-blocco (quello formato dai veri e propri dati audio grezzi). Per conoscere la totale dimensione del file WAV, pertanto, basterà aggiungere a tale valore il numero 44 (che rappresentano i quarantaquattro byte che formano il primo sotto-blocco informativo del file).
Esempio pratico
Per estrarre le suddette informazioni, potremo, dunque, realizzare un codice simile quello che segue:
Pagina in costruzione !
Estrazione delle informazioni con le funzioni esterne del API di SOX
La libreria Sox contiene risorse per poter gestire ampiamente i file audio: riproduzione e registrazione, conversione di vari formati audio in altri formati, nonché applicare vari effetti.
Le risorse del API di Sox consentono anche di ottenere facilmente varie informazioni dai file audio, richiamando l'attuale versione della libreria: libsox.so.2.0.1
Potremo procedere con un codice simile al seguente:
Public Struct sox_signalinfo_t rate As Float ' sox_rate_t: samples per second, 0 if unknown (typedef double sox_rate_t) channels As Integer ' number of sound channels, 0 if unknown precision As Integer ' bits per sample, 0 if unknown length As Long ' samples * chans in file, 0 if unknown, -1 if unspecified (typedef unsigned long sox_uint64_t;) mult As Pointer ' Effects headroom multiplier; may be null End Struct Public Struct sox_format_t filename As Pointer signal As Struct Sox_signalinfo_t End Struct Private sfIn As New Sox_format_t Library "libsox:2.0.1" Private Const SOX_SUCCESS As Byte = 0 ' int sox_init(void) ' Client API: Initialize effects library. SOX_SUCCESS if successful. Private Extern sox_init() As Integer ' sox_format_t * sox_open_read(char const *path, sox_signalinfo_t const *signal, sox_encodinginfo_t const *encoding, char const *filetype) Private Extern sox_open_read(path As String, signalP As Pointer, encoding As Pointer, filetype As String) As Sox_format_t Public Sub Main() Dim err As Integer Dim fileWAV As String fileWAV = "/percorso/del/file.wav" err = sox_init() If err <> SOX_SUCCESS Then Error.Raise("Impossibile inizializzare la libreria 'libsox' !") sfIn = sox_open_read(fileWAV, Null, Null, Null) With sfIn Print "File audio: "; String@(.filename) Print "Frequenza di campionamento: hrz "; .signal.rate Print "Numero di canali: "; .signal.channels Print "Risoluzione campionamento: "; .signal.precision; " bit" Print "Dimensione dei soli dati grezzi del file wav: "; .signal.length * .signal.channels; " byte" ' (il secondo valore è privo dei byte del blocco di intestazione del file wav = 44 byte) End With End
Note
[1] Ordine dei byte
Riferimenti
Per un ulteriore e dettagliata spiegazione rinviamo ai seguenti siti:
- http://en.wikipedia.org/wiki/Resource_Interchange_File_Format
- http://it.wikipedia.org/wiki/WAV
- https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
- http://www.topherlee.com/software/pcm-tut-wavformat.html
- http://msdn.microsoft.com/en-us/library/windows/desktop/ee415713%28v=vs.85%29.aspx
- http://www.digitalpreservation.gov/formats/fdd/fdd000001.shtml
- http://unusedino.de/ec64/technical/formats/wav.html
- http://www-mmsp.ece.mcgill.ca/documents/AudioFormats/WAVE/WAVE.html
- http://sharkysoft.com/archive/lava/docs/javadocs/lava/riff/wave/doc-files/riffwave-frameset.htm
- http://www.johnloomis.org/cpe102/asgn/asgn1/riff.html
- http://www.lightlink.com/tjweber/StripWav/Canon.html