WAVE文件的头文件定义,谁能给解释一下,送分!

时间:2021-12-15 10:02:35
 以下是WAVE文件的头文件定义,谁能给详细的说明一下各个参数都表示什么?还有WAVE文件的音频数据长度属性是哪个参数,在文件中第几个字节? 
  {   
          typedef   struct   _TWavHeader   
          {   
                  long   rId;   
                  long   rLen;   
                  long   wId;   
                  long   fId;   
                  long   fLen;   
                  WORD   wFormatTag;   
                  WORD   nChannels;   
                  long   nSamplesPerSec;   
                  long   nAvgBytesPerSec;   
                  WORD   nBlockAlign;   
                  WORD   wBitsPerSample;   
                  long   dId;   
                  long   wSampleLength;   
          }TWavHeader;   
    
          TWavHeader   wh;   
          wh.rId   =   0x46464952;   
          wh.rLen   =   36;   
          wh.wId   =   0x45564157;   
          wh.fId   =   0x20746d66;   
          wh.fLen   =   16;   
          wh.wFormatTag   =   1;   
          wh.nChannels   =   wChannels;   
          wh.nSamplesPerSec   =   lRate;   
          wh.nAvgBytesPerSec   =   wChannels   *   lRate   *   (wResolution   /   8);   
          wh.nBlockAlign   =   wChannels   *   (wResolution   /   8);   
          wh.wBitsPerSample   =   wResolution;   
          wh.dId   =   0x61746164;   
          wh.wSampleLength   =   0;   
          int   nHandle   =   FileCreate(strFileName);   
          FileSeek(nHandle,   0,   0);   
          FileWrite(nHandle,   &wh,   sizeof(wh));   
          FileClose(nHandle);   
  }   

2 个解决方案

#1


wav文件包括头和数据两部分,其结构如下:(从文件头开始依次排列)
1)首先是字符串“RIFF” ,占4个字节。
2)波形块的大小:DWORD,占4字节。波形块的大小=(文件大小-8)
3)字符串"WAVE",占4个字节。
4)字符串“fmt ”,占4个字节,注意fmt后有个空格字符(0x20)。
5)格式块的大小,DWORD,占4个字节
6)格式块,VC中用WAVEFORMATEX结构体描述,占18个字节,可用sizeof(WAVEFORMATEX)计算。
其中WAVEFORMATEX结构体的定义为:(更详细的描述可以参考msdn)
typedef struct tWAVEFORMATEX
{
    WORD        wFormatTag;         /* format type */
    WORD        nChannels;          /* number of channels (i.e. mono, stereo...) */
    DWORD       nSamplesPerSec;     /* sample rate */
    DWORD       nAvgBytesPerSec;    /* for buffer estimation */
    WORD        nBlockAlign;        /* block size of data */
    WORD        wBitsPerSample;     /* number of bits per sample of mono data */
    WORD        cbSize;             /* the count in bytes of the size of */
                                    /* extra information (after cbSize) */
} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;

7)字符串"data",占4个字节。
8)波形数据的大小,DWORD,占4个字节。
9)声音数据,大小在8)中描述。

以下是一个波形文件样本的头部:
00000000h: 52 49 46 46  E6 E4 05 00 57 41 56 45 66 6D 74 20 ; RIFF驿..WAVEfmt 
00000010h: 12 00 00 00 01 00 01 00 40 1F 00 00 80 3E 00 00 ; ........@...€>..
00000020h: 02 00 10 00 00 00 64 61 74 61  C0 E4 05 00       ; ......data冷..
从该样本可以看出:
该波形文件波形块的大小为386278(0x0005E4E6),波形文件大小为:386278+8 =386286字节;
格式块的大小(WAVEFORMATEX结构体)为18字节;
波形数据的大小为386240字节(0x0005E4C0);

就是说你想要的数据应该就在这两个数据其中一个

格式块(WAVEFORMATEX结构体)中定义的声音数据属性为:
wFormatTag=0x0001 即WAVE_FORMAT_PCM ;
nChannels = 0x0001 即单声道;
nSamplesPerSec = 0x00001F40 即采样率8000Hz;
nAvgBytesPerSec = 0x00003E80 即平均字节速率16000字节(16bit量化),可以根据该数据估计缓冲区的大小;
nBlockAlign = 0x0002 即块联合为2字节(16bit量化,2字节表示一个采样点,播放时必须从以块为单位从块头开始播放);
wBitsPerSample = 0x0010 即每个采样点的比特值为16(16bit量化)。nBlockAlign值即由该值除以8计算出来;
cbSize不使用,填0x0000。

#2


WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”。WAVE文件由文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分。WAVE文件各部分内容及格式见附表。
  常见的声音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。
  对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。  
    WAVE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE文件是由样本组织而成的。在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本是交替出现的。 
  WAVE文件格式说明表   

        偏移地址 字节数 数据类型  内 容 
文件头   00H       4     char     “RIFF”标志 
         04H       4     long int  文件长度 
         08H       4     char      “WAVE”标志 
         0CH       4     char      “fmt”标志 
         10H       4   过渡字节(不定) 
         14H       2    int        格式类别(10H为PCM形式的声音数据) 
        16H       2    int        通道数,单声道为1,双声道为2 
        18H       2    int        采样率(每秒样本数),表示每个通道的播放速度, 
         1CH       4    long int   波形音频数据传送速率,其值为通道数×每秒数据位数×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。 
         20H       2    int        数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。 
         22H       2   每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。 
         24H       4   char        数据标记符“data” 
         28H       4   long int    语音数据的长度 

  PCM数据的存放方式: 

    样本1 样本2 
    8位单声道 0声道 0声道 
    8位立体声 0声道(左) 1声道(右) 0声道(左) 1声道(右) 
    16位单声道 0声道低字节 0声道高字节 0声道低字节 0声道高字节 
    16位立体声 0声道(左)低字节 0声道(左)高字节 1声道(右)低字节 1声道(右)高字节 

    WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。  

    样本大小   数据格式     最大值   最小值 
    8位PCM    unsigned int  225      0 
    16位PCM   int           32767 -32767 

#1


wav文件包括头和数据两部分,其结构如下:(从文件头开始依次排列)
1)首先是字符串“RIFF” ,占4个字节。
2)波形块的大小:DWORD,占4字节。波形块的大小=(文件大小-8)
3)字符串"WAVE",占4个字节。
4)字符串“fmt ”,占4个字节,注意fmt后有个空格字符(0x20)。
5)格式块的大小,DWORD,占4个字节
6)格式块,VC中用WAVEFORMATEX结构体描述,占18个字节,可用sizeof(WAVEFORMATEX)计算。
其中WAVEFORMATEX结构体的定义为:(更详细的描述可以参考msdn)
typedef struct tWAVEFORMATEX
{
    WORD        wFormatTag;         /* format type */
    WORD        nChannels;          /* number of channels (i.e. mono, stereo...) */
    DWORD       nSamplesPerSec;     /* sample rate */
    DWORD       nAvgBytesPerSec;    /* for buffer estimation */
    WORD        nBlockAlign;        /* block size of data */
    WORD        wBitsPerSample;     /* number of bits per sample of mono data */
    WORD        cbSize;             /* the count in bytes of the size of */
                                    /* extra information (after cbSize) */
} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;

7)字符串"data",占4个字节。
8)波形数据的大小,DWORD,占4个字节。
9)声音数据,大小在8)中描述。

以下是一个波形文件样本的头部:
00000000h: 52 49 46 46  E6 E4 05 00 57 41 56 45 66 6D 74 20 ; RIFF驿..WAVEfmt 
00000010h: 12 00 00 00 01 00 01 00 40 1F 00 00 80 3E 00 00 ; ........@...€>..
00000020h: 02 00 10 00 00 00 64 61 74 61  C0 E4 05 00       ; ......data冷..
从该样本可以看出:
该波形文件波形块的大小为386278(0x0005E4E6),波形文件大小为:386278+8 =386286字节;
格式块的大小(WAVEFORMATEX结构体)为18字节;
波形数据的大小为386240字节(0x0005E4C0);

就是说你想要的数据应该就在这两个数据其中一个

格式块(WAVEFORMATEX结构体)中定义的声音数据属性为:
wFormatTag=0x0001 即WAVE_FORMAT_PCM ;
nChannels = 0x0001 即单声道;
nSamplesPerSec = 0x00001F40 即采样率8000Hz;
nAvgBytesPerSec = 0x00003E80 即平均字节速率16000字节(16bit量化),可以根据该数据估计缓冲区的大小;
nBlockAlign = 0x0002 即块联合为2字节(16bit量化,2字节表示一个采样点,播放时必须从以块为单位从块头开始播放);
wBitsPerSample = 0x0010 即每个采样点的比特值为16(16bit量化)。nBlockAlign值即由该值除以8计算出来;
cbSize不使用,填0x0000。

#2


WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”。WAVE文件由文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分。WAVE文件各部分内容及格式见附表。
  常见的声音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。
  对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。  
    WAVE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE文件是由样本组织而成的。在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本是交替出现的。 
  WAVE文件格式说明表   

        偏移地址 字节数 数据类型  内 容 
文件头   00H       4     char     “RIFF”标志 
         04H       4     long int  文件长度 
         08H       4     char      “WAVE”标志 
         0CH       4     char      “fmt”标志 
         10H       4   过渡字节(不定) 
         14H       2    int        格式类别(10H为PCM形式的声音数据) 
        16H       2    int        通道数,单声道为1,双声道为2 
        18H       2    int        采样率(每秒样本数),表示每个通道的播放速度, 
         1CH       4    long int   波形音频数据传送速率,其值为通道数×每秒数据位数×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。 
         20H       2    int        数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。 
         22H       2   每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。 
         24H       4   char        数据标记符“data” 
         28H       4   long int    语音数据的长度 

  PCM数据的存放方式: 

    样本1 样本2 
    8位单声道 0声道 0声道 
    8位立体声 0声道(左) 1声道(右) 0声道(左) 1声道(右) 
    16位单声道 0声道低字节 0声道高字节 0声道低字节 0声道高字节 
    16位立体声 0声道(左)低字节 0声道(左)高字节 1声道(右)低字节 1声道(右)高字节 

    WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。  

    样本大小   数据格式     最大值   最小值 
    8位PCM    unsigned int  225      0 
    16位PCM   int           32767 -32767