我有一个程序,应该读取所有wav文件的元数据。我使用了以下经过解析的struct和fread函数。
这段代码遇到的问题是,对于一些.wav RIFF头fmt文件,即使在如下所示的解析结构之后,读取的元数据也是不正确的,如果我在每个读取函数之间使用fseek函数,可能会有所帮助。
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
using std::string;
typedef struct RIFF_CHUNCK_DISCRIPTOR {
char RIFF[4]; // RIFF Header Magic header
unsigned long ChunkSize; // RIFF Chunk Size
char WAVE[4]; // WAVE Header
};
typedef struct FMT_CHUNCK_DISCRIPTOR {
char fmt[4]; // FMT header
unsigned long Subchunk1Size; // Size of the fmt chunk
unsigned short AudioFormat; // Audio format
unsigned short NumOfChan; // Number of channels
unsigned long SamplesPerSec; // Sampling Frequency in Hz
unsigned long bytesPerSec; // bytes per second
unsigned short blockAlign; // 2=16-bit mono, 4=16-bit stereo
unsigned short bitsPerSample; // Number of bits per sample
};
typedef struct DATA_SUB_CHUNCK {
char Subchunk2ID[4]; // "data" string
unsigned long Subchunk2Size; // Sampled data length
};
int main(int argc, char* argv[]) {
const char* fileName;
cout << "enter f name " << fileName;
RIFF_CHUNCK_DISCRIPTOR RCD;
FMT_CHUNCK_DISCRIPTOR FCD;
DATA_SUB_CHUNCK DSC;
FILE* InFile = fopen(fileName, "r");
fread(&RCD, 1, sizeof(RIFF_CHUNCK_DISCRIPTOR), InFile);
fread(&FCD, 1, sizeof(FMT_CHUNCK_DISCRIPTOR), InFile);
fread(&DSC, 1, sizeof(DATA_SUB_CHUNCK), InFile);
}我使用多个结构的原因是为了确保头文件的所有数据都被正确读取,因为尽管大多数wav文件头数据是有序的,但有时并不是这样。
发布于 2021-10-26 11:41:50
我会以二进制模式打开文件,即用fopen(fileName, "rb")替换fopen(fileName, "r")
在某些系统上(您没有说出您使用的是哪种操作系统,我假设是Windows?)在文本/非二进制模式下,某些字符在读取过程中会被替换。
https://stackoverflow.com/questions/69717037
复制相似问题