/*wave 文件一共有四个Chunk组成,其中第三个Chunk可以省略,每个Chunk有标示(ID),大小(size,就是本Chunk的内容部分长度),内容三部分组成*/
/*------------------------------------------------
| RIFF WAVE Chunk |
| ID = 'RIFF' |
| RiffType = 'WAVE' |
------------------------------------------------
| Format Chunk |
| ID = 'fmt ' |
------------------------------------------------
| Fact Chunk(optional) |
| ID = 'fact' |
------------------------------------------------
| Data Chunk |
| ID = 'data' |
------------------------------------------------*/
typedef struct waveheader
{
/****RIFF WAVE CHUNK*/
unsigned char a[4];//四个字节存放'R','I','F','F'
long int b; //整个文件的长度-8;每个Chunk的size字段,都是表示除了本Chunk的ID和SIZE字段外的长度;
unsigned char c[4];//四个字节存放'W','A','V','E'
/****Format CHUNK*/
unsigned char d[4];//四个字节存放'f','m','t',''
long int e; //16后没有附加消息,18后有附加消息;一般为16,其他格式转来的话为18
short int f; //编码方式,一般为0x0001;
short int g; //声道数目,1单声道,2双声道;
long int h; //采样频率;
long int i; //每秒所需字节数;
short int j; //每个采样需要多少字节,若声道是双,则两个一起考虑;
short int k; //即量化位数
/***Data Chunk**/
unsigned char p[4];//四个字节存放'd','a','t','a'
long int q; //语音数据部分长度,不包括文件头的任何部分
} waveheader;//定义WAVE文件的文件头结构体
waveheader *get_waveheader(int bits, int rates, int channels, unsigned long size)
{
waveheader *header = malloc(sizeof(*header));
header->a[0] = 'R';
header->a[1] = 'I';
header->a[2] = 'F';
header->a[3] = 'F';
header->b = size - 8;
header->c[0] = 'W';
header->c[1] = 'A';
header->c[2] = 'V';
header->c[3] = 'E';
header->d[0] = 'f';
header->d[1] = 'm';
header->d[2] = 't';
header->d[3] = ' ';
header->e = 16;
header->f = 1;
header->g = channels;
header->h = rates;
header->i = size / (rates * channels * bits / 8);
header->j = channels * bits / 8;
header->k = bits;
header->p[0] = 'd';
header->p[1] = 'a';
header->p[2] = 't';
header->p[3] = 'a';
header->q = size;
return header;
}

被折叠的 条评论
为什么被折叠?



