C语言wav语音头文件,C读取wav文件的头文件和数据

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#include"stdlib.h"

#include"stdio.h"

int main()

{

int i; //用作循环计数

unsigned char ch[100]; //用来存储wav文件的头信息

FILE *fp;

fp=fopen("C:\\Users\\Lenovo\\Desktop\\wavread\\1.wav","rb");//为读,打开一个wav文件

if((fp=fopen("C:\\Users\\Lenovo\\Desktop\\wavread\\1.wav","rb"))==NULL)//若打开文件失败,退出

{

printf("can't open thisfile\n");

exit(0);

}

现在只能读取头文件,可是头文件后的数据要怎么读出来,求大神指教!

/**********输出wav文件的所有信息**********/

printf("该wav文件的所有信息:");

for(i=0;i<58;i++)

{

ch[i]=fgetc(fp); //每次读取一个字符,存在数组ch中

if(i%16==0) //每行输出16个字符对应的十六进制数

printf("\n");

if(ch[i]<16) //对小于16的数,在前面加0,使其用8bit显示出来

printf("0%x",ch[i]);

else

printf("%x ",ch[i]);

}

/*********RIFF WAVEChunk的输出*********/

printf("\n\nRIFF WAVE Chunk信息:");

//输出RIFF标志

printf("\nRIFF标志:");

for(i=0;i<4;i++)

{

printf("%x ",ch[i]);

}

//输出size大小

printf("\nsize:ox");

for(i=7;i>=4;i--) //低字节表示数值低位,高字节表示数值高位

{

if(ch[i]<16)

printf("0%x",ch[i]);

else

printf("%x",ch[i]);

}

//输出WAVE标志

printf("\nWAVE标志:");

for(i=8;i<12;i++)

{

if(ch[i]<16)

printf("0%x ",ch[i]);

else

printf("%x ",ch[i]);

}

/*******Format Chunk的输出*******/

printf("\n\nFormat Chunk信息:");

//输出fmt 标志

printf("\nfmt 标志:");

for(i=12;i<16;i++)

{

if(ch[i]<16)

printf("0%x ",ch[i]);

else

printf("%x ",ch[i]);

}

//输出size段

printf("\nsize:ox");

for(i=19;i>15;i--)

{

if(ch[i]<16)

printf("0%x",ch[i]);

else

printf("%x",ch[i]);

}

//输出编码方式

printf("\n编码方式:ox");

for(i=21;i>19;i--)

{

if(ch[i]<16)

printf("0%x",ch[i]);

else

printf("%x",ch[i]);

}

//输出声道数目

printf("\n声道数目:ox");

for(i=23;i>21;i--)

{

if(ch[i]<16)

printf("0%x",ch[i]);

else

printf("%x",ch[i]);

}

if(ch[i+1]==1) //1表示单声道,2表示双声道

printf(" 单声道");

else

printf(" 双声道");

//输出采样频率

printf("\n采样频率:ox");

for(i=27;i>23;i--)

{

if(ch[i]<16)

printf("0%x",ch[i]);

else

printf("%x",ch[i]);

}

//输出每秒所需字节数

printf("\n每秒所需字节数:ox");

for(i=31;i>27;i--)

{

if(ch[i]<16)

printf("0%x",ch[i]);

else

printf("%x",ch[i]);

}

//输出数据块对齐单位

printf("\n数据块对齐单位:ox");

for(i=33;i>31;i--)

{

if(ch[i]<16)

printf("0%x",ch[i]);

else

printf("%x",ch[i]);

}

//输出每个采样所需bit数

printf("\n每个采样所需bit数:ox");

for(i=35;i>33;i--)

{

if(ch[i]<16)

printf("0%x",ch[i]);

else

printf("%x",ch[i]);

}

//输出附加信息

if(ch[16]==18) //若Format Chunk的size大小为18,则该模块的最后两个字节为附加信息

{ //若为16,则无附加信息

printf("\n附加信息:ox");

for(i=37;i>35;i--)

{

if(ch[i]<16)

printf("0%x",ch[i]);

else

printf("%x",ch[i]);

}

}

/*******Fact Chunk的输出*******/

printf("\n\nFact Chunk信息:");

//输出fact标志

printf("\nfact标志:");

for(i=38;i<42;i++)

{

if(ch[i]<16)

printf("0%x ",ch[i]);

else

printf("%x ",ch[i]);

}

//输出size

printf("\nsize:ox");

for(i=45;i>41;i--)

{

if(ch[i]<16)

printf("0%x",ch[i]);

else

printf("%x",ch[i]);

}

//输出data段数据

printf("\ndata段数据:");

for(i=46;i<50;i++)

{

if(ch[i]<16)

printf("0%x ",ch[i]);

else

printf("%x ",ch[i]);

}

/*******Data Chunk的输出*******/

printf("\n\nData Chunk信息:");

//输出data标志

printf("\ndata标志:");

for(i=50;i<54;i++)

{

if(ch[i]<16)

printf("0%x ",ch[i]);

else

printf("%x ",ch[i]);

}

//输出数据大小

printf("\n数据大小:ox");

for(i=57;i>53;i--)

{

if(ch[i]<16)

printf("0%x",ch[i]);

else

printf("%x",ch[i]);

}

printf("\n");

fclose(fp);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值