WAV文件头信息
2016-03-15 13:19
281 查看
wave文件的格式:
00H 4 char "RIFF"标志
04H 4 long int 文件长度
08H 4 char "WAVE"标志
0CH 4 char "fmt"标志
10H 4 过渡字节(不定)
14H 2 int 格式类别(10H为PCM形式的声音数据)
16H 2 int 通道数,单声道为1,双声道为2
18H 2 int 采样率(每秒样本数),表示每个通道的播放速度,
1CH 4 long int 波形音频数据传送速率,其值为通道数×每秒数据位数×每样
本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。
20H 2 int 数据块的调整数(按字节算的),其值为通道数×每样本的数据位
值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其
值用于缓冲区的调整。
22H 2 每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多
个声道,对每个声道而言,样本大小都一样。
24H 4 char 数据标记符"data"
28H 4 long int 语音数据的长度
文件头长度加起来是42字节,但是实际长度是44个字节(用UltraEdit打开一个WAVE文件,数一下就知道了)。如果用以个结构体来定义WAVE文件头应该为:
struct WAVEFILEHEADER
{
char chRIFF[4];
DWORD dwRIFFLen;
char chWAVE[4];
char chFMT[4];
DWORD dwFMTLen;
PCMWAVEFORMAT pwf;
char chDATA[4];
DWORD dwDATALen;
};
但是实际测试,并不是所有的wave文件头都一样。比较麻烦的就是windows下自带的那个录音机录下的wav,文件头有58个 Byte。所以,比较好的办法是,首先读取n长的一段字符,例如60个;然后从中查找关键字“data”,“data”之后的一个DWORD是实际音频数 据的长度,得到这个长度len,再从这DWORD后开始读取len个字节,就可以读到文件尾。如果是双声道的,那么数据是交替存放的;如果是16bit采 样的,每两个字节会以小端的方式存储一个AD值。根据这样的方式,就可以顺利读取音频数据了。
原文地址: /article/4855580.html
00H 4 char "RIFF"标志
04H 4 long int 文件长度
08H 4 char "WAVE"标志
0CH 4 char "fmt"标志
10H 4 过渡字节(不定)
14H 2 int 格式类别(10H为PCM形式的声音数据)
16H 2 int 通道数,单声道为1,双声道为2
18H 2 int 采样率(每秒样本数),表示每个通道的播放速度,
1CH 4 long int 波形音频数据传送速率,其值为通道数×每秒数据位数×每样
本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。
20H 2 int 数据块的调整数(按字节算的),其值为通道数×每样本的数据位
值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其
值用于缓冲区的调整。
22H 2 每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多
个声道,对每个声道而言,样本大小都一样。
24H 4 char 数据标记符"data"
28H 4 long int 语音数据的长度
文件头长度加起来是42字节,但是实际长度是44个字节(用UltraEdit打开一个WAVE文件,数一下就知道了)。如果用以个结构体来定义WAVE文件头应该为:
struct WAVEFILEHEADER
{
char chRIFF[4];
DWORD dwRIFFLen;
char chWAVE[4];
char chFMT[4];
DWORD dwFMTLen;
PCMWAVEFORMAT pwf;
char chDATA[4];
DWORD dwDATALen;
};
但是实际测试,并不是所有的wave文件头都一样。比较麻烦的就是windows下自带的那个录音机录下的wav,文件头有58个 Byte。所以,比较好的办法是,首先读取n长的一段字符,例如60个;然后从中查找关键字“data”,“data”之后的一个DWORD是实际音频数 据的长度,得到这个长度len,再从这DWORD后开始读取len个字节,就可以读到文件尾。如果是双声道的,那么数据是交替存放的;如果是16bit采 样的,每两个字节会以小端的方式存储一个AD值。根据这样的方式,就可以顺利读取音频数据了。
原文地址: /article/4855580.html
相关文章推荐
- Matlab和java间socket通信
- git 使用吐槽
- 晓月_【场景分类】
- 【Linux命令002】tr命令
- leetcode70.[DP] Climbing Stairs My Submissions Question
- SYN5301型 毫秒表时间检定仪
- CSS实现DIV水平 垂直居中-1
- java.io.IOException: The same input jar is specified twice
- iOS 打开系统打电话 发短信 邮件 浏览器 地图
- 更改Qt应用程序图标的方法
- 用js实现跑马灯抽奖效果
- mysql的binlog安全删除
- 咏南开发框架演示下载
- [DPDK][转]DPDK编程开发(4)—lcore
- vs2010更新EF模型时报错
- Android Scroller工具类的简单用法
- Go语言核心之美 1.3-赋值及类型声明篇
- Java注解Annotation详解
- 8、关于增强版的GenericityJDBCUtils的实现,可灵活的处理select的返回结果
- SYN2101型 NTP网络时间服务器