Вопрос
Как открыть WAV файл для дальнейшего редактирования, то есть нужно описание какой байт, в файле, к чему относится: частота дискредитации, битрейд, длина звуковой дорожки и сама звуковая дорожка. В итоге приблизительно должен получится массив с частотами или что-то в этом роде.
Ответ
.WAV — файл (как и любой RIFF файл) состоит из набора (не знаю как сказать) thunk-ов, про которые в инструкции говорится:
если программка не знает зачем он нужен — она должна его пропустить (в каждом есть заголовочек, а в ем длина thunkа), а сам файл начинается с заголовка:
struct RIFF
{
char ID[4]; // четыре буковки "RIFF"
long Len; // длина файла без этого заголовка
}
Riff = { "RIFF", 0 };
дальше обычно заголовок собственно WAVа:
struct WAVE
формат бывает 1-Microsoft Pulse Code, 0x101 — IBM mu-law, 0x102 — IBM a-law,
{
char ID[4]; // "WAVE" — заголовок WAV
char Fmt[4]; // "fmt" — thunk формата
long Len; // длинна етого thunka
int Format; // собственно формат
int Channels; // число каналов (1/2)
long SamplesPerSecond; // отсчетов/сек
long AvgBytesPerSecond; // байтов/сек
int BlockAlign; // выравнивание блоков
int BitsPerSample; // битов на отсчет
}
Wave = { "WAVE", "fmt", 16L, 1, 1, 0L, 0L, 1, 8 } ;
0x103 — IBM AVC Adaptive Differential Pulse Code, но самый распространенный (по моему) #1
дальше thunk самплов (отсчетов) один там или несколько:
struct DATA {
а потом сами отсчеты, если каналов 2, то отсчет 1 канала, потом 2го, 1го…
char ID[4]; // "data"
long Len; // длина етого thunkа (должен быть выровнен на
// границу слова)
} Data = { "data", 0L };
если битов/отсчет меньше чем в байте/слове то дополняется нулями в младших битах и все равно занимает байт или слово.
Писал я это все так (для 8-битовых отсчетов):
DataLen= число отсчетов в байтах
if( DataLen % 2 ) PadFlg=1;
else PadFlg=0;
Riff.Len=sizeof(Wave)+sizeof(Data)+DataLen+PadFlg;
Wave.SamplesPerSecond=частота квантования в Гц
Wave.AvgBytesPerSecond=то же самое
Data.Len=DataLen+PadFlg;
fwrite(&Riff,1,sizeof(Riff),fo);
fwrite(&Wave,1,sizeof(Wave),fo);
fwrite(&Data,1,sizeof(Data),fo);
{
unsigned c;
for(long i=0; i<DataLen; i++)
{
c=getc(fi);
putc(c,fo);
}
if( PadFlg ) putc(c,fo);
}
Из конференции Expert_FAQ
Copyright 2000-2004 Сообщество Чайников
Контактная информация