WAVE(特指PCM编码格式)
文件头一般是44字节,可用UltraEdit查看wav文件:
|
偏移地址
|
字节数
|
数据类型
|
内
容
|
文件头
|
00H
|
4
|
char
|
"RIFF"
标志
|
04H
|
4
|
long int
|
文件长度
| |
08H
|
4
|
char
|
"WAVE"
标志
| |
0CH
|
4
|
char
|
"fmt"
标志
| |
10H
|
4
|
|
过渡字节(不定) 通常为16。不为16则文件头长度要比44字节大。
| |
14H
|
2
|
short int
|
格式类别(01
H
为
PCM
形式的声音数据
)
| |
16H
|
2
|
short int
|
通道数,单声道为
1
,双声道为
2
| |
18H
|
4
|
int
|
采样率,22.05KHz/...
| |
1CH
|
4
|
long int
|
波形音频数据传送速率,其值为通道数
×
每秒数据位数
×
每样本的数据位数/
8
。播放软件利用此值可以估计缓冲区的大小。
| |
20H
|
2
|
short int
|
数据块的调整数(按字节算的),其值为通道数
×
每样本的数据位值/
8
。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
| |
22H
|
2
|
short int
|
量化位数,8/16..
| |
24H
|
4
|
char
|
数据标记符"
data
"
| |
28H
|
4
|
long int
|
语音数据的长度
|
文件由文件头和数据段组成,设文件总长度为fileSize字节,头大小为headSize,数据段长度为dataSize,则fileSize=headSize+dataSize;
04H处那个文件长度指fileSize-8;28H处的即为dataSize。
wav文件是二进制文件,对其读写只能用read()和write()函数。
write:
比如将一个short int 形value写入二进制文件,则要定义
char tmp[3];tmp[0]=value;tmp[1]=value>>8;tmp[2]='/0';
file.write(tmp,2);
而不能用别的函数,如file<<value;<<这些函数都是先将value转换为文本,再写入文件的。比如value=0x1234=4660;则写入文件的不是两个字节的0x1234,而是四个字节的4 6 6 0这四个字符。
//××××××××对于二进制文件的读
可以不用读char,而直接读short int 等(只能用fwrite(),fstream的write不行)。下面是例程:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
fread(),fwrite()不一定就读、写的都是char(byte)的。可以是别的类型