PDA

View Full Version : [c++] wav calcolare la dyrata del sound


okay
06-03-2007, 11:46
Qualcuno sa come si calcola la durata di un sound?

la formula per calcolare la durata in secondi di un sound?

tramite le intestazione dell'hader del wav è possibile ricavare la sua durata?

andbin
06-03-2007, 12:02
Qualcuno sa come si calcola la durata di un sound?

la formula per calcolare la durata in secondi di un sound?

tramite le intestazione dell'hader del wav è possibile ricavare la sua durata?La durata in secondi è: numero_campioni / frequenza_di_campionamento
Questo vale in generale.

In un file WAV, la frequenza di campionamento ce l'hai nel header "fmt ", il numero di campioni invece non ce l'hai direttamente ma lo potresti calcolare abbastanza facilmente se i campioni sono in formato PCM esaminando la dimensione del chunk "data". La dimensione del chunk è: numero_campioni * numero_canali * byte_per_campione.
Questi ultimi due dati li ottieni dal header "fmt ".

okay
06-03-2007, 12:22
La durata in secondi è: numero_campioni / frequenza_di_campionamento
Questo vale in generale.

In un file WAV, la frequenza di campionamento ce l'hai nel header "fmt ", il numero di campioni invece non ce l'hai direttamente ma lo potresti calcolare abbastanza facilmente se i campioni sono in formato PCM esaminando la dimensione del chunk "data". La dimensione del chunk è: numero_campioni * numero_canali * byte_per_campione.
Questi ultimi due dati li ottieni dal header "fmt ".



float okay;
okay = (float)alBufferLen/(float)alFreqBuffer;

l'ho scoperto prima di leggerti in quanto congetturavo sulla lunghezza in byte del file e quanti byte per secondo passano che sono in conformità della frequenza.

grazie come sempre

andbin
06-03-2007, 12:38
l'ho scoperto prima di leggerti in quanto congetturavo sulla lunghezza in byte del file e quanti byte per secondo passano che sono in conformità della frequenza.Sì ma occhio che come ho detto, con parole diverse, che la dimensione del buffer dipende dal numero di canali e dalla dimensione di 1 campione.

okay
06-03-2007, 12:44
ho un problema!!

se è a 16 bit devo dividerlo per 2 il risultato.

ora devo leggere le intestazioni ma come codice ho solo quello per scrivere:


pFile = fopen(OUTPUT_WAVE_FILE, "wb");

// Prepare a WAVE file header for the captured data
sprintf(sWaveHeader.szRIFF, "RIFF");
sWaveHeader.lRIFFSize = 0;
sprintf(sWaveHeader.szWave, "WAVE");
sprintf(sWaveHeader.szFmt, "fmt ");
sWaveHeader.lFmtSize = sizeof(WAVEFORMATEX);
sWaveHeader.wfex.nChannels = 1;
sWaveHeader.wfex.wBitsPerSample = 16;
sWaveHeader.wfex.wFormatTag = WAVE_FORMAT_PCM;
sWaveHeader.wfex.nSamplesPerSec = 22050;
sWaveHeader.wfex.nBlockAlign = sWaveHeader.wfex.nChannels * sWaveHeader.wfex.wBitsPerSample / 8;
sWaveHeader.wfex.nAvgBytesPerSec = sWaveHeader.wfex.nSamplesPerSec * sWaveHeader.wfex.nBlockAlign;
sWaveHeader.wfex.cbSize = 0;
sprintf(sWaveHeader.szData, "data");
sWaveHeader.lDataSize = 0;

fwrite(&sWaveHeader, sizeof(WAVEHEADER), 1, pFile);


mi aiuti andbin...
come lo leggo il files wave e ottenere:
sWaveHeader.wfex.wBitsPerSample = ? ... 8 o 16 bit?

andbin
06-03-2007, 13:13
come lo leggo il files wave e ottenere:
sWaveHeader.wfex.wBitsPerSample = ? ... 8 o 16 bit?Innanzitutto quel WAVEHEADER credo che sia una struttura scritta appositamente per rappresentare l'header.
Stai lavorando su Windows con le API Win32? Allora credo che ti convenga usare le API per il "Multimedia File I/O", vedi <qui> (http://msdn2.microsoft.com/en-us/library/ms712601.aspx).