3月28日整理

本文详细解析了wav文件的头部结构,并提供了一段使用C语言实现的读取wav文件头部信息的代码示例。同时分析了代码中可能存在的错误,并给出了修正建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输出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的数目;如不成功,返回实际读取的元素个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值