输出wav文件的头部
1、wave文件的格式
2、程序代码
3、分析
1、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 语音数据的长度
2、程序代码
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define MAX_LENGTH 256
struct head
{
char chRIFF[4]; //RIFF标志
DWORD dwRIFFLen; //文件长度
char chWAVE[4]; // WAVE标志
char chFMT[4]; //fmt标志
DWORD dwFMTLen; //过渡字节
WORD wFormatTag; //采样数据格式
WORD nChannels; //通道数目
WORD nSamplesPerSec;//采样速率
DWORD nAvgBytePerSec; //波形音频数据传送速率
WORD nBlockAlign;//数据块的调整数
WORD wBitsPerSample; //每样本的数据位数
char chDATA[4]; //数据标记符
DWORD dwDATALen; //语音数据的长度
};
void main()
{
int i;
FILE *fp;
struct head *p;
char *wav_save;
wav_save=(char *) malloc (sizeof(char)*MAX_LENGTH);
p=(struct head *) malloc (sizeof(struct head));
memset(p,0,sizeof(struct head));
memset(wav_save,0,MAX_LENGTH);
fp=fopen("d:\\111s.wav","r");
if((fp=fopen("d:\\111s.wav","r"))==NULL)
{
printf("can't open this file\n");
}
fread(p,sizeof(struct head),1,fp);
printf("RIFF标志:");
for(i=0;i<4;i++)
{
printf("%c",p->chRIFF[i]);
}
printf("\n");
printf("文件长度:");
printf("%d",p->dwRIFFLen);
printf("\n");
printf("WAVE标志:");
for(i=0;i<4;i++)
{
printf("%c",p->chWAVE[i]);
}
printf("\n");
printf("fmt标志:");
for(i=0;i<4;i++)
{
printf("%c",p->chFMT[i]);
}
printf("\n");
printf("过度字节");
printf("%d",p->dwFMTLen);
printf("\n");
printf("采样数据格式:");
printf("%d",p->wFormatTag);
printf("\n");
printf("通道数目:");
printf("%d",p->nChannels);
printf("\n");
printf("采样率:");
printf("%d",p->nSamplesPerSec);
printf("\n");
printf("波形音频数据传输速率:");
printf("%d",p->nAvgBytePerSec);
printf("\n");
printf("数据块的调整数:");
printf("%d",p->nBlockAlign);
printf("\n");
printf("每样本的位数:");
printf("%d",p->wBitsPerSample);
printf("\n");
printf("数据标记符:");
for(i=0;i<4;i++)
{
printf("%c",p->chDATA[i]);
}
printf("\n");
printf("语音数据的长度:");
printf("%d",p->dwDATALen);
printf("\n");
printf("\n");
free(wav_save);
free(p);
system("pause");
}
3、分析
所犯错误:
1、指向结构体的指针p申请空间错误,主要原因sizeof函数应用错误;
2、输出类型出现错误,将word类型按照int类型输出。
fread函数
原型:
size_t fread(void *buffer, size_t count, size_t size, FILE *stream);
从一个文件流中读数据,读取count个元素,每个元素size字节,如果调用成功,返回实际读取的count的数目;如不成功,返回实际读取的元素个数。