| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10047 人关注过本帖, 1 人收藏
标题:C语言怎样调取WAV文件中的具体数据
取消只看楼主 加入收藏
a045000zql
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-6-28
结帖率:100%
收藏(1)
已结贴  问题点数:10 回复次数:5 
C语言怎样调取WAV文件中的具体数据
我用C语言读取WAV文件数据如下
#include "stdlib.h"
#include "stdio.h"
 
int main()
{
    int i;   //用作循环计数
    unsigned char ch[100];  //用来存储wav文件的头信息
    FILE *fp;
 
    fp=fopen("E:\\positional_mix21.wav","rb");//为读,打开一个wav文件
 
    if((fp=fopen("E:\\positional_mix21.wav","rb"))==NULL) //若打开文件失败,退出
    {
        printf("can't open this file\n");
        exit(0);
    }
 
/**********输出wav文件的所有信息**********/
    printf("该wav文件的所有信息:");
    for(i=0;i<72;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 WAVE Chunk的输出*********/
    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]);
    }


/*******Data Chunk的输出*******/
    printf("\n\nData Chunk信息:");
//输出data标志
    printf("\ndata标志:");
    for(i=36;i<40;i++)
    {
        if(ch[i]<16)
            printf("0%x ",ch[i]);
        else
        printf("%x ",ch[i]);
    }
 
//输出数据大小
    printf("\n数据大小:ox");
    for(i=43;i>39;i--)
    {
        if(ch[i]<16)
            printf("0%x",ch[i]);
        else
        printf("%x",ch[i]);
    }
 
    printf("\n");
 
    fclose(fp);
}
positional_mix21.rar (266.8 KB)



附件里是.WAV音频文件,请问各位大神,我这个程序最后读出来的数据部分为什么都是0,用别的音频文件就有数据,而且数据的大小也和MATLAB中的数据数量不一样,找不出来原因。
搜索更多相关主题的帖子: WAV 数据 printf 输出 for 
2017-07-04 00:07
a045000zql
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-6-28
收藏
得分:0 
回复 2楼 rjsp
是ch[44]后的部分,不是WAV开头不能空白几秒钟,这个音频一共只有5秒的时间,而且都没有空白,64 61 74 61是Ascii字符“data”,后面4个字节是数据大小,再后面就是具体的数据了,但是我的程序读出来全部都是0,如果换了别的WAV文件就不是。我不知道问题出在哪里。
2017-07-04 09:48
a045000zql
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-6-28
收藏
得分:0 
回复 3楼 吹水佬
大神,我想要的是最后DATA部分的数据,要对这些数据进行处理,并最后生成一个新的WAV文件,所以第一步,请问应该怎样才能读出来这部分内容?感激不尽

[此贴子已经被作者于2017-7-4 10:00编辑过]

2017-07-04 09:54
a045000zql
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-6-28
收藏
得分:0 
回复 6楼 吹水佬
程序读出来的WAV文件信息如下:
52 49 46 46 cc ba 06 00 57 41 56 45 66 6d 74 20
10 00 00 00 01 00 02 00 22 56 00 00 88 58 01 00
04 00 10 00 64 61 74 61 a8 ba 06 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00.....

第四行64 61 74 61 a8 ba 06 00代表开始数据区域和后面的数据总数,再往后面就是真正的Wave文件的数据体了,但是全部都是00
2017-07-04 11:17
a045000zql
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-6-28
收藏
得分:0 
我明白了。刚开始认为因为音频一开始就有声音,以为数据从最开始就应该不为0,进入了一个思维误区。
2017-07-04 14:38
a045000zql
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-6-28
收藏
得分:0 
那么如果我想把data部分的数据全部读出来,用double型表示该怎样做到?望各位大神不吝教导!
这个数据在matlab中是两列,每列110250个double型数据,想在C中用相同的形式表示。
2017-07-04 15:01
快速回复:C语言怎样调取WAV文件中的具体数据
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013646 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved