RIFF文件和WAV文件格式

来源:互联网 发布:网络招人的技巧 编辑:程序博客网 时间:2024/05/16 15:20

 RIFF文件和WAV文件格式


  在Windows环境下,大部分的多媒体文件都依循着一种结构来存放信息,这种结构称为"资源互换文件格式"(Resources lnterchange File Format),简称RIFF。例如声音的WAV文件、视频的AV1文件等等均是由此结构衍生出来的。RIFF可以看作是一种树状结构,其基本构成单位为chunk,犹如树状结构中的节点,每个chunk由"辨别码"、"数据大小"及"数据"所组成。
  辨别码由4个ASCII码所构成,数据大小则标示出紧跟其后数据的长度(单位为Byte),而数据大小本身也用掉4个Byte,所以事实上一个chunk的长度为数据大小加8。一般而言,chunk本身并不允许内部再包含chunk,但有两种例外,分别为以"RIFF"及"L1ST"为辨别码的chunk。而针对此两种chunk,RIFF又从原先的"数据"中切出4个Byte。此4个Byte称为"格式辨别码",然而RIFF又规定文件中仅能有一个以"RIFF"为辨别码的chunk。
  只要依循此一结构的文件,我们均称之为RIFF档。此种结构提供了一种系统化的分类。如果和MS一DOS文件系统作比较,"RIFF"chunk就好比是一台硬盘的根目录,其格式辨别码便是此硬盘的逻辑代码(C:或D:),而"L1ST"chunk即为其下的子目录,其他的chunk则为一般的文件。至于在RIFF文件的处理方面,微软提供了相关的函数。视窗下的各种多媒体文件格式就如同在磁盘机下规定仅能放怎样的目录,而在该目录下仅能放何种数据。
  WAV为WAVEFORM(波形)的缩写。声音文件的结构如图1所示,"RIFF"的格式辨别码为"WAVE"。整个文件由两个chunk所组成:辨别码"fmt"(注意,最后一个是空白字符!)及data。

RIFF WAVE Chunk以'FIFF'作为标示,然后紧跟着为size字段,该size是整个wav文件大小减去ID 和Size所占用的字节数,即FileLen - 8 = Size。然后是Type字段,为'WAVE',表示是wav文件。

各部分结构定义如下:

struct RIFF_HEADER
{
  char szRiffID[4];  // 'R','I','F','F'
  DWORD dwRiffSize;
  char szRiffFormat[4]; // 'W','A','V','E'
};
在"fmt"的chunk下包含了一个PCMWAVEFORMAT数据结构,其定义如下:

typedef struct pcmwaveformat - tag {
  WAVEFORMAT wf ;
  WORD wBitsPerSample;
  } PCMWAVEFORMAT;


  typedef struct waveformat - tag {
  WORD wFormatTag ;
  WORD nChannels;
  DWORD nSamplesPerSec;
  DWORD nAvgBytesperSec;
  WORD nBlockAlign;
  } WAVEFORMAT;

  其意义分别为:

  wFormatTag:记录着此声音的格式代号,例如WAVE_FORMAT_PCM,WAVE_F0RAM_ADPCM等等。
  nChannels:记录声音的频道数。
  nSamp1esPerSec:记录每秒取样数。
  nAvgBytesPerSec:记录每秒的数据量。
  nBlockA1ign:记录区块的对齐单位。
  wBitsPerSample:记录每个取样所需的位元数。

 Fact Chunk是可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk,
    结构定义如下:
struct FACT_BLOCK
{
  char  szFactID[4]; // 'f','a','c','t'
  DWORD  dwFactSize;
};
  "data"Chunk包含真正的声音数据, Data Chunk头结构定义如下:
    struct DATA_BLOCK
{
  char szDataID[4]; // 'd','a','t','a'
  DWORD dwDataSize;
}; 

Window目前仅提供WAVE_FORMAT_PCM一种数据格式,所代表的意义是脉派编码调变(Pu1se Code Modulation)。针对此格式,Windows定义了在"data"的chunk中数据的存放

情形,图2中列出了四种不同频道数及取样所需的位元数以及位元位置的安排。     

 

 

 

    RIFF WAVE Chunk         ID  = 'RIFF'      RiffType = 'WAVE'                

                   Format C   ID = 'fmt 

       Fact Chunk(optional)      ID = 'fact'     (此部分可选) 

Data Chunk       ID = 'data'

 

图1 WAV文件结构

 

 

单声道  

8bit量化

取样1

取样2  

取样3 

取样4 

 声道0  

 声道0  

 声道0  

 声道0  

双声道

16bit量化

取样1

取样2

声道0(左) 

 声道1(右)

 声道0(左)  

  声道1(右) 

单声道

8bit量化

取样1

取样2

 声道0  

(低位字节) 

声道0  

(高位字节) 

声道0  

(低位字节) 

声道0  

(高位字节) 

双声道

16bit量化

取样1

声道0(左) 

(低位字节) 

声道0(左) 

(高位字节) 

声道1(右) 

(低位字节) 

声道1(右)

 (高位字节) 

 

                         图2 PCM文件中位元安排方式  

第一排表示单声道8位元,第二排表示双声道8位元,第三排表示单声道16位元,第四排表示双声道16位元。8位元代表音量大小由8个位元所表示,16位元则代表音量大小由16个位元所表示。理论上8位元可以表示0~255,16位元可表示0~65536,不过windows却定16位元其值的范围从-32168~32167。此外尚有一点要注意的是,0并不一定代表无声,而是由中间的数值来决定,也就是在8位元时为128,16位元时为0才是无声。所以,若程序设计时需放入无声的数据,需特别注意声音格式是16或是8位元,以放入适当的值。

原创粉丝点击