| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10150 人关注过本帖, 1 人收藏
标题:C语言怎样调取WAV文件中的具体数据
只看楼主 加入收藏
a045000zql
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-6-28
结帖率:100%
收藏(1)
已结贴  问题点数:10 回复次数:12 
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
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:5 
我这个程序最后读出来的数据部分为什么都是0

真是听不懂呀,你所谓的“最后读出来的数据部分”在哪里?
是指 ch[44]到ch[71] 吗?凭什么一个WAV开头不能空白几秒钟
2017-07-04 08:38
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:5 
图片附件: 游客没有浏览图片的权限,请 登录注册

#include <stdio.h>
#include <stdint.h>

typedef struct _WAVFORMAT_
{
    char ChunkID[4];
    uint32_t ChunkSize;
    char Format[4];
    char Subchunk1ID[4];
    uint32_t Subchunk1Size;
    uint16_t AudioFormat;
    uint16_t NumChannels;
    uint32_t SampleRate;
    uint32_t ByteRate;
    uint16_t BlockAlign;
    uint16_t BitsPerSample;
    char Subchunk2ID[4];
    uint32_t Subchunk2Size;
} WAVFORMAT, *PWAVFORMAT;

int main(void)
{
    FILE *fp = fopen("positional_mix21.wav", "rb");
    if (fp == NULL)
        return 0;
    WAVFORMAT wf;
    fread(&wf, sizeof(WAVFORMAT), 1, fp);
    printf("      ChunkID: %.4s\n", wf.ChunkID);
    printf("    ChunkSize: %d\n",   wf.ChunkSize);
    printf("       Format: %.4s\n", wf.Format);
    printf("  Subchunk1ID: %.4s\n", wf.Subchunk1ID);
    printf("Subchunk1Size: %d\n",   wf.Subchunk1Size);
    printf("  AudioFormat: %d\n",   wf.AudioFormat);
    printf("  NumChannels: %d\n",   wf.NumChannels);
    printf("   SampleRate: %d\n",   wf.SampleRate);
    printf("     ByteRate: %d\n",   wf.ByteRate);
    printf("   BlockAlign: %d\n",   wf.BlockAlign);
    printf("BitsPerSample: %d\n",   wf.BitsPerSample);
    printf("  Subchunk2ID: %.4s\n", wf.Subchunk2ID);
    printf("Subchunk2Size: %d\n",   wf.Subchunk2Size);
    fclose(fp);
    return 0;
}
2017-07-04 08:40
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
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 5楼 a045000zql
跟着文件头下面的就是DATA数据部分吧,大小是441000字节。
2017-07-04 10: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
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
感觉还有很多东西要学~先记下了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-07-04 11:42
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用a045000zql在2017-7-4 11:17:13的发言:

程序读出来的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

64 61 74 61 是字串"data"
a8 ba 06 00 是32bit数值(data大小441000字节)
“全部都是00”?共有441000字节,你读出了几个?

2017-07-04 11:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
再往后面就是真正的Wave文件的数据体了,但是全部都是00
你只读了前面一点点,怎么就妄言数据体全部都是0?
你这个wav也就是前面区区88个字节为0,只占数据总长度的 0.02% 不到。
2017-07-04 11:47
快速回复:C语言怎样调取WAV文件中的具体数据
数据加载中...
 
   



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

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