Всем привет, уважаемые формучане.
Учусь проигрывать звук с wave файлов (в будущем перейду на ogg) и столкнулся со следующей проблемой: на выводе (код ниже) получаю сектор fact. Как понимаю, я где-то прохожу сектор data и не могу понять где. Ткните меня носом в ошибку, чтобы дошло :)
Спасибо за помощь!
FILE* fp(NULL); fp = fopen( "test.wav", "r"); if ( !fp) { endWithError( ( char*)"Cannot open file"); } char type[4]; DWORD size, chunkSize; short formatType, channels; DWORD sampleRate, avgBytesPerSec; short bytesPerSample, bitsPerSample; DWORD dataSize; fread( type, sizeof( char), 4, fp); if ( type[0] != 'R' || type[1] != 'I' || type[2] != 'F' || type[3] != 'F') return endWithError( ( char*)"Not RIFF"); fread( &size, sizeof( DWORD), 1, fp); fread( type, sizeof( char), 4, fp); if ( type[0] != 'W' || type[1] != 'A' || type[2] != 'V' || type[3] != 'E') return endWithError( ( char*)"Not WAVE"); fread( type, sizeof( char), 4, fp); if ( type[0] != 'f' || type[1] != 'm' || type[2] != 't' || type[3] != ' ') return endWithError( ( char*)"Not fmt"); fread( &chunkSize, sizeof( DWORD), 1, fp); fread( &formatType, sizeof( short), 1, fp); fread( &channels, sizeof( short), 1, fp); fread( &sampleRate, sizeof( DWORD), 1, fp); fread( &avgBytesPerSec, sizeof( DWORD), 1, fp); fread( &bytesPerSample, sizeof( short), 1, fp); fread( &bitsPerSample, sizeof( short), 1, fp); fread( type, sizeof( char), 4, fp); cout << type << endl; system( "pause");
У меня было вот так
// u32 = unsigned int // u16 = unsigned short // u8 = unsigned char struct WaveHeader{ u32 chunkId; //"RIFF" u32 chunkSize; //file size - 8bytes u32 format; //"WAVE"-be (0x57415645) u32 subchunk1Id; //"fmt"-be (0x666d7420) u32 subchunk1Size; // 16 - PCM u16 audioFormat; // 1 - PCM u16 numChannels; // 1 - mono, 2 - stereo u32 sampleRate; // 44100 u32 byteRate; // bytes in sec u16 blockAlign; // u16 bitsPerSample; // 16 bit u32 subchunk2Id; //"data"-be (0x64617461) u32 subchunk2Size; //data size }; ... WaveHeader m_header; ... u32 bytesRead = m_file->read(( u8*)&m_header, sizeof( m_header) ); ... u8 * m_data = new u8[ m_header.subchunk2Size ]; ... u32 offset = m_file->size( ) - m_header.subchunk2Size; m_file->seek( offset, СНАЧАЛА ); m_file->read( m_data , m_header.subchunk2Size );
вроде всё понятно, читаем header ЦЕЛИКОМ, проверяем, m_header.subchunk2Size размер данных, идём на нужную позицию и читаем данные.
3dhater
Сейчас попробую, спасибо, почему-то сразу не догадался.:-)
SnikersMan
Читал что в wav-файле теги могут быть в разном порядке.
s3dworld
Спасибо, в будущем буду учитывать такую вероятность.
s3dworld
> Читал что в wav-файле теги могут быть в разном порядке.
+ 1
Тема в архиве.