微软Wav音频文件解析

WAVE PCM 音频格式

           Wave文件是微软RIFF标准存储的多媒体文件的一种形式。一个RIFF文件包含一个文件头和多个数据块(chunks).WAVE文件是包含一个“WAVE”数据块,其包含两个子的数据块,一个是“fmt ”块,和”data”块。“fmt ”块指名数据的格式,而“data”块包含实际的取样值。下图为WAVE语音文件的经典格式:

          

注明 :little endia:内存的低字节存放数据的地位,高字节存放数据的高位

       Big endia:内存的低字节存放数据的高位,高字节存放数据的低位。

 

Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。

 

各个字段解释:

ChunkID(0-3): 4个字节,big-endian form,ASCII的形参存储字符串“RIFF.

ChunkSize(4-7):占4个字节,little-endian form,它的值的大小是整个文件的大小减去ChunkID 和 ChunkSize所占的8个字节的大小。大小等于36+SubChunk2Size,或者4 + (8 + SubChunk1Size) + (8 + SubChunk2Size)

Format(8-11):占4个字节,包含字符“WAVE.

"WAVE" format 包含两个子块:“fmt ”和“data.

 

“fmt ”块的数据格式如下:

 Subchunk1ID(12-15) :占4个字节,包含字符”fmt ” .

Subchunk1Size:占4个字节,该字段表示该块的大小,除去Subchunk1ID 和Subchunk1Size所占的8个字节大小。对于PCM 形式的文件,该值的大小为16个字节。即下面所占的大小:

AudioFormat占两个字节,PCM形式的文件等于1,其他的值代表某些形式的数据压缩。

NumChannels声道数,Mono = 1, Stereo = 2

SampleRate采样率,如8000,16000

ByteRate: 每秒的字节数,大小为:SampleRate * NumChannels*BitsPerSample/8
BlockAlign:块对齐,即所有频道一个样本所占的字节数,大小为:NumChannels*BitsPerSample/8
 

“data”块的数据格式如下:

Subchunk2ID占4个字节,包含字符”data”.

Subchunk2Size:音频数据的字节数,即要读取数据的大小。值为:NumSamples * NumChannels * BitsPerSample/8

*   Data:实际的声音数据。

 

例子:72字节的WAVE文件字节序列如下:

 

 

从上图可以看出:ChunkSize的十六进制数据为:000824:十进制为:2084

字节率ByteRate:十六进制:00015888,十进制为:88200

注:WAVE文件默认的存储方式为:little-endian.若ChunkID的值为“RIFX”则为big-endian.

抽样的数据必须以偶数字节数结束。

8位的抽样数据用无符号的字节,大小从0-255(2^8-1),16位样本是用有符号的整数来存储,大小为:-32768(-2^16/2)-32767(2^16/2-1).

RIFF stands for Resource Interchange File Format

  • Audio/visual interleaved data (.AVI)
  • Waveform data (.WAV)

注明:在不同的CPU上,相同的数据类型占用的位数不同,如:16bit 486PC 机器,char 占8个字节,int 占 16,short or short int 占16位, long or long int 占32 位

 而在32bit Pentium pc上,char:8,int:32,short or short int :16,long or long int:32,所以为了保持软件在不同机器上的兼容性,最好用char ,short ,long

 

 

Wavread读取的数据转化为int : yi=y*2^nbits/2;

 

数据结构定义:

 typedef struct RIFF_HEADER
  {
      char szRiffID[4];//"RIFF"
      DWORD dwRiffSize;
      char szRiffFormat[4];//"WAVE"
    }RIFF_HEADER;
  
 typedef struct WAVE_FORMAT
 {  WORD wFormatTag;   
    WORD wChannels;
     DWORD dwSamplesPerSec; 
     DWORD dwAvgBytesPerSec;
     WORD wBlockAlign; 
     WORD wBitsPerSample;
 } WAVE_FORMAT; 
    
 typedef struct FMT_BLOCK 
  {  char szFmtID[4]; 
     DWORD dwFmtSize; 
    WAVE_FORMAT wavFormat;
  }FMT_BLOCK;   
 typedef  struct FACT_BLOCK 
   {       char szFmtID[4]; 
          DWORD dwFactSize;
          DWORD dwFactData;
    }FACT_BLOCK;  
   typedef  struct DATA_BLOCK
     {  char szDataID[4]; // 'd','a','t','a'  
        DWORD dwDataSize; 
   }DATA_BLOCK; 
   


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值