首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析Riff wav报头

解析Riff wav报头
EN

Stack Overflow用户
提问于 2021-10-26 03:08:01
回答 1查看 195关注 0票数 0

我有一个程序,应该读取所有wav文件的元数据。我使用了以下经过解析的struct和fread函数。

这段代码遇到的问题是,对于一些.wav RIFF头fmt文件,即使在如下所示的解析结构之后,读取的元数据也是不正确的,如果我在每个读取函数之间使用fseek函数,可能会有所帮助。

代码语言:javascript
复制
#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文件头数据是有序的,但有时并不是这样。

EN

回答 1

Stack Overflow用户

发布于 2021-10-26 11:41:50

我会以二进制模式打开文件,即用fopen(fileName, "rb")替换fopen(fileName, "r")

在某些系统上(您没有说出您使用的是哪种操作系统,我假设是Windows?)在文本/非二进制模式下,某些字符在读取过程中会被替换。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69717037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档