音频文件(.wav)解析读取
wav是一种无损的音频文件格式,所有的WAV都有一个文件头,包含了音频流的编码参数,即支持非压缩的PCM编码方式,也支持常见的压缩编码格式。
当WAV文件采用PCM编码方式时,PCM文件和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)解析读取相关推荐
- 多种音频文件(.wav, .mp3, .ogg)转化为wav文件,支持分、秒级别切分
多种音频文件(.wav, .mp3, .ogg)转化为wav文件,支持分.秒级别切分 需求:调用python脚本,输入源文件路径.目标路径.切割的时长.切割时长的时间单位,能够将对应路径的源音频文件按 ...
- VC++ 保存数据为音频文件(WAV)学习
根据到目前我的认识,凡是保存为某种格式的文件的程序,都是用C++做的.下面来学习一下保存为wav文件: 1. 音频简介 经常见到这样的描述: 44100HZ 16bit stereo 或者 22050 ...
- php修改音频文件_解析用PHP读写音频文件信息的详解(支持WMA和MP3)
// AudioExif.class.php // 用PHP进行音频文件头部信息的读取与写入 // 目前只支持 WMA 和 MP3 两种格式, 只支持常用的几个头部信息 // // 写入信息支持: T ...
- C#中使用SoundPlayer播放音频文件(wav文件)
场景 上位机软件中需要实现一个报警功能,即在某条件下循环播放能发出"嘟嘟"声的音频文件. 注: 博客主页: https://blog.csdn.net/badao_liumang_ ...
- python读取多个文件夹中的音频文件_Python3.7 读取音频根据文件名生成脚本的代码...
Warning: 仅适用于文件名即字幕本体,按音频时常平均拆分来生成字幕,其他情况不适合. 以下为读取 mp3 文件夹下的音频,然后按市场,平均来生成字幕,例如文件名 a-pp-le.mp3,字幕也将 ...
- 音频文件wav转gsm
sox guide.wav -r 8000 -c 1 guide.gsm SoX [ general options ] [ format options ] infile1 [ [ format o ...
- PCM音频文件(.wav)压缩成ADPCM(.wav)
PCM音频文件压缩成adpcm格式的文件有多中方法(如使用ms ACM.sox等),本文主要介绍使用公开的算法(如下所示,如果需要可到网上搜一下: ========================== ...
- PCM音频文件(.wav)压缩成ADPCM(.wav) ,wav文件分析,wav 文件格式
本文来自: http://blog.csdn.net/jtlyr/article/details/5321884 这里还有介绍一些wav文件的其他网站,记录下: https://ccrma.stanf ...
- pcm 采样率转换_PCM编码与Waveform音频文件(.wav)格式详解
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...
- 痞子衡嵌入式:PCM编码与Waveform音频文件(.wav)格式详解
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...
最新文章
- VS2012下基于Glut OpenGL glScissor示例程序:
- GM吐露CWLK开服细节 8月10日放补丁
- 【Android 安全】DEX 加密 ( 代理 Application 开发 | 解压 apk 文件 | 判定是否是第一次启动 | 递归删除文件操作 | 解压 Zip 文件操作 )
- 计算机网络:子网划分、子网掩码、CIDR 、路由聚合相关计算详解
- python之shutil模块
- Android之app作为服务器解决跨域问题
- JavaScript知识笔记(三)——内置对象、浏览器对象
- RedHat Enterprise Linux 6 配置Xmanager ,实现图形界面连接
- Java加密与解密的艺术~数字证书详解
- 学习 About iOS App Programming 第一天
- 用友集团前端面经整理及答案
- MySQL Java的JDBC编程
- 面向对象和面向过程的区别及面试问答
- python怎么设计奥运五环_如何用Python中turtle画笔制作奥运五环
- Reactive的方式访问Redis
- ububtu安装谷歌浏览器+搜狗输入法+WPS+vscode+vim
- Thinking in uml 大象 系统用例
- 小布机器人怎么断网_小布同学智能机器人好坏判断有诀窍,三大误区要避免
- html+css实现奥运五环(环环相扣)
- 探讨10kV配电运维风险及检修对策-易电务
热门文章
- 新浪出输入法了,深蓝词库转换更新到1.3.1——增加对新浪拼音输入法的支持
- java自定义一个数组类(封装多种方法)
- panda3D学习之路
- Android开发——简单计算器实现
- 声纹识别之I-Vector
- Word2Vec-VS-fastText
- Golang Cannot use ss(type AAA) as type AAA in map index
- php 上传 413,PHP CURL上传文件出现413 Request Entity Too Large
- Leetcode 300-最长递增子序列
- 计算机风筝设计图片教程,如何利用塑料袋制作风筝图解教程