0

我有一个程序可以从使用 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)标题数据后读取的数据是正确的。

4

0 回答 0