我有一个程序可以从使用 RIFF wav fmt 的 .wav 文件中读取诸如通道数等标题信息。我想让它与 riff wav fmt 之后的任何 .wav 扩展文件兼容。这是我到目前为止的代码。
WaveReader.h:
typedef struct {
unsigned char ChunkID[4];
uint32_t ChunkSize;
unsigned char Format[4];
unsigned char SubChunk1ID[4];
uint32_t SubChunk1Size;
uint16_t AudioFormat;
uint16_t NumChannels;
uint32_t SampleRate;
uint32_t BytesRate;
uint16_t BlockAlign;
uint16_t BitsPerSample;
unsigned char SubChunk2ID[4];
uint32_t SubChunk2Size;
} RiffWav;
WaveReader.cpp
RiffWav Header;
InFile = fopen(m_strFileName, "rb");
uint64_t Header_Size = 44;// sizeof(InFile);
CHAR* HeaderBuffer = new CHAR[Header_Size];
fread(HeaderBuffer, 0x01, Header_Size, InFile);
int NumChannels = Header.NumChannels;
int BitsPerSample = Header.BitsPerSample
我在使用此代码时遇到的问题是它并不总是自己读取每个 .wav 文件的正确信息,我必须使用 fseek 函数来定制 fread 函数以从每个文件中读取正确的标头数据具体文件。
如果我不使用 fseek 函数,程序会从大多数 .wav 文件中读取正确的数据,但少数除外。
有没有一种方法我不必使用 fseek 函数来使该程序与任何 RIFF wav fmt 文件兼容?
编辑:我使用在线 .wav 文件阅读器手动选择了 fseek 偏移量,然后我使用 Visual Studio 查看了标头数据的偏移量。
在上下文中,根据在线 .wav 文件阅读器,其中一个文件的通道数为 2,该程序的通道数为 5200,BitsPerSample 等于 2。因此,使用 fseek(InFile, 12, SEEK_SET)
标题数据后读取的数据是正确的。