wav是一种无损的音频文件格式,所有的WAV都有一个文件头,包含了音频流的编码参数,即支持非压缩的PCM编码方式,也支持常见的压缩编码格式。

当WAV文件采用PCM编码方式时,PCM文件和WAV文件的区别只在于是否有文件头,下面介绍一下wav文件的文件头。

wav文件头

偏移
地址

字节数

数据
类型

字段名称 字段说明
00H 4 字符 文档标识 大写字符串"RIFF",标明该文件为有效的 RIFF 格式文档。
04H 4 长整型数 文件数据长度 从下一个字段首地址开始到文件末尾的总字节数。该字段的数值加 8 为当前文件的实际长度。
08H 4 字符 文件格式类型 所有 WAV 格式的文件此处为字符串"WAVE",标明该文件是 WAV 格式文件。
0CH 4 字符 格式块标识 小写字符串,"fmt "。
10H 4 长整型数 格式块长度。 其数值不确定,取决于编码格式。可以是 16、 18 、20、40 等。(PCM 编码为16)
14H 2 整型数 编码格式代码。 常见的 WAV 文件使用 PCM 脉冲编码调制格式,该数值通常为 1。
16H 2 整型数 声道个数 单声道为 1,立体声或双声道为 2
18H 4 长整型数 采样频率 每个声道单位时间采样次数。常用的采样频率有 11025, 22050 和 44100 kHz。
1CH 4 长整型数 数据传输速率, 该数值为:声道数×采样频率×每样本的数据位数/8。
20H 2 整型数 数据块对齐单位 采样帧大小。该数值为:声道数×位数/8。
22H 2 整型数 采样位数 存储每个采样值所用的二进制数位数。常见的位数有 4、8、12、16、24、32
24H 2 整型数 扩展区长度

22(根据格式块长度有关)

26H 4 字符 数据块标识 data
2aH 4 长整型数 数据块长度 数据块的长度
2eH        

当使用C程序读写wav格式数据时,先要把头文件的内容读取了,并判断文件的是否有损坏(可以通过文件长度判断)。

首先定义头文件的结构体:

typedef struct WAV_Format {char ChunkID[4];    /* "RIFF" */int ChunkSize;    /* 36 + Subchunk2Size */char Format[4];    /* "WAVE" *//* sub-chunk "fmt" */char Subchunk1ID[4];    /* "fmt " */int Subchunk1Size;    /* 16 for PCM */short AudioFormat;    /* PCM = 1*/short NumChannels;    /* Mono = 1, Stereo = 2, etc. */int SampleRate;    /* 8000, 44100, etc. */int ByteRate;    /* = SampleRate * NumChannels * BitsPerSample/8 */short BlockAlign;    /* = NumChannels * BitsPerSample/8 */    short BitsPerSample;    /* 8bits, 16bits, etc. *//* sub-chunk "data" */char Subchunk2ID[4];    /* "data" */int Subchunk2Size;    /* data size */}WaveHead; 

编写函数读取.wav文件的文件头,并返回文件头长度,数据块的数据长度,指向数据块的指针。

/*****************************************************************************
*@fn    : read wave head and return wave head len*@input : wh      ,WaveHead point :filename , wave file path point *@output: fn      ,file point of data chunk : flen    ,data len *@return: head_len,wave head len*@author:
*@data  :
*******************************************************************************/
int WaveReadHead(WaveHead *wh, char *filename,FILE *fn, int *flen)
{FILE *fd = NULL;  if((fd = fopen(filename, "rb")) == NULL) {printf("WaveReadHead(): cannot open file %s\n",filename);}  int head_len = 0;fseek(fd, 0L, SEEK_END);*flen = ftell(fd);fseek(fd,0L, SEEK_SET);if (1!= fread(wh->ChunkID,4,1,fd))  return -1;head_len += sizeof(int);if (1!= fread(&wh->ChunkSize,4,1,fd))  return -1;head_len += sizeof(int);if (1!= fread(wh->Format,4,1,fd))  return -1;head_len += 4*sizeof(char);if (1!= fread(wh->Subchunk1ID,4,1,fd))  return -1;head_len += sizeof(int);if (1!= fread(&wh->Subchunk1Size,4,1,fd))  return -1;head_len += sizeof(int);if (1!= fread(&wh->AudioFormat,2,1,fd))  return -1;head_len += sizeof(short);if (1!= fread(&wh->NumChannels,2,1,fd))  return -1;head_len += sizeof(short);if (1!= fread(&wh->SampleRate,4,1,fd))  return -1;head_len += sizeof(int);if (1!= fread(&wh->ByteRate,4,1,fd))  return -1;head_len += 4*sizeof(char);if (1!= fread(&wh->BlockAlign,2,1,fd))  return -1;head_len += sizeof(short);if (1!= fread(&wh->BitsPerSample,2,1,fd))  return -1;head_len += sizeof(short);int i = 0;char *str;while (i>(wh->Subchunk1Size - 16)){if(1 != fread(str,1,1,fd))  return -1;}head_len += (wh->Subchunk1Size - 16);if(1!= fread(wh->Subchunk2ID,4,1,fd)) return -1;head_len +=4;if(1!= fread(&wh->Subchunk2Size,4,1,fd)) return -1;head_len +=4;*flen -=head_len;if(strncmp(wh->ChunkID,"RIFF",4)!=0|| strncmp(wh->Subchunk1ID,"fmt",3)!=0||strncmp(wh->Format,"WAVE",4)!=0|| strncmp(wh->Subchunk2ID,"data",4)!=0||wh->ChunkSize- wh->Subchunk2Size != head_len-8){printf("Wave head read err!\n");if (fd)  fclose(fd);}fn = fd;return(head_len);
}

编写一个测试函数。

int main()
{FILE *fp = NULL;WaveHead wh;int flen = 0;int head_len = 0;char *filename ="0_0_0_0_1_1_1_1.wav";if(0!=( head_len = WaveReadHead(&wh,filename,fp,&flen)));printf("head_len: %d",head_len);
}

使用kaldi yesno 文件“0_0_0_0_1_1_1_1.wav”作为测试,程序运行结果如下:

音频文件(.wav)解析读取相关推荐

  1. 多种音频文件(.wav, .mp3, .ogg)转化为wav文件,支持分、秒级别切分

    多种音频文件(.wav, .mp3, .ogg)转化为wav文件,支持分.秒级别切分 需求:调用python脚本,输入源文件路径.目标路径.切割的时长.切割时长的时间单位,能够将对应路径的源音频文件按 ...

  2. VC++ 保存数据为音频文件(WAV)学习

    根据到目前我的认识,凡是保存为某种格式的文件的程序,都是用C++做的.下面来学习一下保存为wav文件: 1. 音频简介 经常见到这样的描述: 44100HZ 16bit stereo 或者 22050 ...

  3. php修改音频文件_解析用PHP读写音频文件信息的详解(支持WMA和MP3)

    // AudioExif.class.php // 用PHP进行音频文件头部信息的读取与写入 // 目前只支持 WMA 和 MP3 两种格式, 只支持常用的几个头部信息 // // 写入信息支持: T ...

  4. C#中使用SoundPlayer播放音频文件(wav文件)

    场景 上位机软件中需要实现一个报警功能,即在某条件下循环播放能发出"嘟嘟"声的音频文件. 注: 博客主页: https://blog.csdn.net/badao_liumang_ ...

  5. python读取多个文件夹中的音频文件_Python3.7 读取音频根据文件名生成脚本的代码...

    Warning: 仅适用于文件名即字幕本体,按音频时常平均拆分来生成字幕,其他情况不适合. 以下为读取 mp3 文件夹下的音频,然后按市场,平均来生成字幕,例如文件名 a-pp-le.mp3,字幕也将 ...

  6. 音频文件wav转gsm

    sox guide.wav -r 8000 -c 1 guide.gsm SoX [ general options ] [ format options ] infile1 [ [ format o ...

  7. PCM音频文件(.wav)压缩成ADPCM(.wav)

    PCM音频文件压缩成adpcm格式的文件有多中方法(如使用ms ACM.sox等),本文主要介绍使用公开的算法(如下所示,如果需要可到网上搜一下: ========================== ...

  8. PCM音频文件(.wav)压缩成ADPCM(.wav) ,wav文件分析,wav 文件格式

    本文来自: http://blog.csdn.net/jtlyr/article/details/5321884 这里还有介绍一些wav文件的其他网站,记录下: https://ccrma.stanf ...

  9. pcm 采样率转换_PCM编码与Waveform音频文件(.wav)格式详解

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...

  10. 痞子衡嵌入式:PCM编码与Waveform音频文件(.wav)格式详解

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...

最新文章

  1. VS2012下基于Glut OpenGL glScissor示例程序:
  2. GM吐露CWLK开服细节 8月10日放补丁
  3. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 解压 apk 文件 | 判定是否是第一次启动 | 递归删除文件操作 | 解压 Zip 文件操作 )
  4. 计算机网络:子网划分、子网掩码、CIDR 、路由聚合相关计算详解
  5. python之shutil模块
  6. Android之app作为服务器解决跨域问题
  7. JavaScript知识笔记(三)——内置对象、浏览器对象
  8. RedHat Enterprise Linux 6 配置Xmanager ,实现图形界面连接
  9. Java加密与解密的艺术~数字证书详解
  10. 学习 About iOS App Programming 第一天
  11. 用友集团前端面经整理及答案
  12. MySQL Java的JDBC编程
  13. 面向对象和面向过程的区别及面试问答
  14. python怎么设计奥运五环_如何用Python中turtle画笔制作奥运五环
  15. Reactive的方式访问Redis
  16. ububtu安装谷歌浏览器+搜狗输入法+WPS+vscode+vim
  17. Thinking in uml 大象 系统用例
  18. 小布机器人怎么断网_小布同学智能机器人好坏判断有诀窍,三大误区要避免
  19. html+css实现奥运五环(环环相扣)
  20. 探讨10kV配电运维风险及检修对策-易电务

热门文章

  1. 新浪出输入法了,深蓝词库转换更新到1.3.1——增加对新浪拼音输入法的支持
  2. java自定义一个数组类(封装多种方法)
  3. panda3D学习之路
  4. Android开发——简单计算器实现
  5. 声纹识别之I-Vector
  6. Word2Vec-VS-fastText
  7. Golang Cannot use ss(type AAA) as type AAA in map index
  8. php 上传 413,PHP CURL上传文件出现413 Request Entity Too Large
  9. Leetcode 300-最长递增子序列
  10. 计算机风筝设计图片教程,如何利用塑料袋制作风筝图解教程