wav 文件头解析
概述
28H
8
char
6661637404000000H
定
char temp2
30H
4
char
40 E2 05 00H
定
char temp3
34H
4
char
"data"
char wave_data="data"
38H
4
long int
采样数据字节数
lont int size2=
文长
-60
3CH
到文尾
采样数据
表
6
SBC
(
Sub-Band Coding
子带编码)语音编码后的
WAV
文件头格式表(共
58
字节)
偏移地址
字节数
数据类型
内容
文件头定义为
00H
4
char
"RIFF"
char riff_id[4]="RIFF"
04H
4
long int
文件总长
-8
long int size0=
文总长
-8
08H
8
char
"WAVEfmt "
char wave_fmt[8]
10H
4
long int
12000000H(SBC)
long int size1=0x12
14H
2
int
71 00H
int fmttag=0x71
16H
2
int
声道数
int channel=1
或
2
18H
4
long int
采样率
long int samplespersec
1CH
4
long int
每秒播放字节数
long int bytepersec
20H
2
int
采样一次占字节数
int blockalign=0x25
22H
4
long int
量化数
long int bitpersamples=16
26H
4
char
"fact"
char wave_fact="fact"
2AH
8
char
0400000076280400H
定
char temp
32H
4
char
"data"
char wave_data="data"
36H
4
long int
采样数据字节数
lont int size2=
文长
-59
表
7
CELP(
Code Excited Linear Prediction
码激励线性预测编码——近
10
年来最成功的语音编码算
法
)
语音编码后的
WAV
文件头格式表(共
58
字节)
偏移地址
字节数
数据类型
内容
文件头定义为
00H
4
char
"RIFF"
char riff_id[4]="RIFF"
04H
4
long int
文件总长
-8
long int size0=
文总长
-8
08H
8
char
"WAVEfmt "
char wave_fmt[8]
10H
4
long int
12000000H(CELP)
long int size1=0x12
14H
2
int
70 00H
int fmttag=0x70
16H
2
int
声道数
int channel=1
或
2
18H
4
long int
采样率
long int samplespersec
1CH
4
long int
每秒播放字节数
long int bytepersec
20H
2
int
采样一次占字节数
int blockalign=0x0C
22H
4
long int
量化数
long int bitpersamples=16
26H
4
char
"fact"
char wave_fact="fact"
2AH
8
char
0400000060520700H
定
char temp
32H
4
char
"data"
char wave_data="data"
36H
4
long int
采样数据字节数
lont int size2=
文长
-58
概念
1
、
读取
WAV
文件,填写
WAVEFORMATEX
结构
WAVEFORMATEX
⑵
地址
04H-07H
,
值为
“64 5D E0 00”
,
存储的是文件大小刨去
8
字节后的值,
注意这个是
little-endian
的,也就是高地址存低位,地地址存高位,所以
Size=00E05D64H=14703972
字节,比文件总大小少
8
个字节,这
8
个字节就是
00H-07H
;
⑶
地址
08H-0FH
,就是
“WAVEfmt ”
标记;
⑷
地址
10H-13H
,
fmt
格式的块大小,这种格式时是
“10 00 00 00”
,也是
little-endian
的,即块大小
为
16
,也有可能为
18
,这时最后多了
2
个字节的附加信息。其他格式的可能是
20
;
⑸
地址
14H-15H
,
“01 00”
,也是
little-endian
的,标记编码方式,一般为
0x0001
;
⑹
地址
16H-17H
,
“01 00”
,也是
little-endian
,标记声道数,这里值为
1
。注意
1
代表单声道,
2
代
表双声道;
⑺
地址
18H-1BH
,
“44 AC 00 00”
,也是
little-endian
,标记采样频率,这里为
441000Hz
;
⑻
地址
1CH-1FH
,
“88 58
01 00”
每秒所需的字节数,也是
little-endian
,
bytepersec=00015888H=88200(
字节
)
。(加上点自己的看法
88200=
频率
*
采样一次占的字节数
=44100*2
,我觉得这种关系是存在的,虽然很多资料上没提到);
⑼
地址
20H-21H
,
“02 00”
,采样一次占字节数
,有些地方也叫数据块对齐单位,也是
little-endian
的,这里是两个字节。声道数
*
量化数
/8=1*16/8=2(
字节
)
;
⑽
地址
22H-23H
,
“10 00”
,量化数,也就是每个采样需要的
bit
数,也是
little-endian
的,所以这里
是
16
位;
⑾
地址
24H-27H
,
“64 61 74 61”
,就是
“data”
了;
⑿
地址
28H-2BH
,
“40 5D E0 00”
,
存储的是文件大小刨去
44
字节后的值,
这个也是
little-endian
的,
Size=00E05D40H=14703936
字节。
2
、编程方法
⑴
计算文件播放时长
文件播放时长
=(
文件总长度
-
文件头长度
)/
每秒所需的字节数。
如上例
duration=(14,703,980 -44)/88200=166.7s
,这个在
kugoo
的制作铃声功能下可以查询的到。
⑵
按时间点切割文件
(只精确到秒已用程序实现过,
精确到
0.1s
理论上也是可以,
但是没有用程序
去实现)。
①
切割文件的前
N
秒为一个新文件
第一步,计算
N
秒的偏移量,
SetOff=N*
每秒所需的字节数
第二步,算出新文件的大小,修改文件头的两个
size
值。
第三步,
新的文件头以二进制形式写入到新文件,
紧接着根据偏移量把原文件中的第
45
字节到
(setOff-1)
字节写入到新文件。
②
窃取中间某个时间段为一个新文件
这里可以根据①的步骤进行,同样的要修改文件头。
三、
wav
文件格式
WAV
为微软公司
(Microsoft)
开发的一种声音文件格式,文件作为多媒体中使用的声波文件格式
之一,
它是以
RIFF(Resource Interchange File Format)
格式为标准的。
每个
WAV
文件的头四个字节便
是
“RIFF”
。
WAV
文件由文件头和数据体两大部分组成。其中文件头又分为
RIFF/WAV
文件标识段
和声音数据格式说明段两部分,包含了音频流的编码参数。
WAV
对音频流的编码没有硬性规定,除了
PCM
(
Pulse Code Modulation
脉冲编码调制)之外,
还有几乎所有支持
ACM
规范的编码都可以为
WAV
的音频流进行编码,如
MP3
编码同样也可以运
用在
WAV
中,只要安装好了相应的
Decode
(指令解码),就可以欣赏这些
WAV
了。
在
windows
平台下,基于
PCM
编码的
WAV
是被支持得最好的音频格式,所有音频软件都能完
美支持,由于本身可以达到较高的音质要求,
因此,
WAV
也是音乐编辑创作的首选格式,适合保存
音乐素材。因此,基于
PCM
编码的
WAV
被作为了一种中介的格式,常常使用在其他编码的相互转
换之中,例如
MP3
转换成
WMA
。
WAV
文件可以存储大量格式的数据,通常采用的音频编码方式是脉冲编码调制
(PCM)
。由于
WAV
格式源自
Windows/Intel
环境,
因而采用
Little-Endian(
小字节序、
低字节序
)
字节顺序进行存储。
表
1
WAV
文件的文件头
偏移地址
字节数
类型
内容
00H~03H
4
字符
资源交换文件标志(
RIFF
)
04H~07H
4
长整数
从下个地址开始到文件尾的总字节数
08H~0BH
4
字符
WAV
文件标志(
WAVE
)
0CH~0FH
4
字符
波形格式标志(
FMT
)
10H~13H
4
整数
过滤字节(一般为
00000010H
)
14H~15H
2
整数
格式种类(值为
1
,表示数据
PCMμ
律编码的数据)
16H~17H
2
整数
通道数,单声道为
1
,双声音为
2
18H~1BH
4
长整数
采样频率
1CH~1FH
4
长整数
波形数据传输速率(每秒平均字节数)
20H~21H
2
整数
数据的调整数(按字节计算)
22H~23H
2
整数
样本数据位数
表
2
WAV
声音文件的数据块
偏移地址
字节数
类型
内容
24H~27H
4
字符
数据标志符(
data
)
28H~2BH
4
长整型
采样数据总数
2CH...
...
采样数据
WAV
文件作为最经典的
Windows
多媒体音频格式,应用非常广泛,它使用三个参数来表示声
音:
采样位数、
采样频率和声道数。
声道有单声道和立体声之分,
采样频率一般有
11025Hz
(
11kHz
)
、
22050Hz
(
22kHz
)和
44100Hz
(
44kHz
)三种。
WAV
文件所占容量
=
(采样频率
×
采样位数
×
声道)
×
时间
/8
(
1
字节
=8bit
)。
常见的
WAV
文件主要有两种,
分别对应于单声道
(11.025 kHz
采样率、
8 bit
的采样值
)
和双声道
(44.1 kHz
采样率、
16 bit
的采样值
)
。采样率是指声音信号在
“
模/数
”
转换过程中单位时间内采样的
次数。采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为
8
位的短整数
(short
int
00H
—
FFH)
;而对于双声道立体声声
音文件,每次采样数据为一个
16
位的整数
(int),
高八位和低八位分别代表左右两个声道。
WAV
文件数据块包含以脉冲编码调制
(PCM)
格式表示的样本,
WAV
文件是由样本组织而成的。
在单声道
WAV
文件中,声道
0
代表左声道,声道
1
代表右声道;在多声道
WAV
文件中,样本是
交替出现的。
表
3
WAV
文件格式说明
偏移地址
文件头
字节数
数据类型
内容
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
语音数据的长度
表
4
PCM
数据的存放方式
样本
1
样本
2
8
位单声道
0
声道
0
声道
8
位立体声
0
声道(左)
1
声道(右)
0
声道(左)
1
声道(右)
16
位单声道
0
声道低字节
0
声道高字节
0
声道低字节
0
声道高字节
16
位立体声
0
声道(左)低字节
0
声道(左)高字节
1
声道(右)低字节
1
声道(右)高字节
WAV
文件的每个样本值包含在一个整数
i
中,
i
的长度为容纳指定样本长度所需的最小字节数。
首先存储低有效字节,表示样本幅度的位放在
i
的高有效位上,剩下的位置为
0
,这样
8
位和
16
位
的
PCM
波形样本的数据格式如下所示。
样本大小
数据格式
最大值
最小值
8
位
PCM
unsigned int
225
0
16
位
PCM
int
32767
-32767
你可能喜欢
28H
8
char
6661637404000000H
定
char temp2
30H
4
char
40 E2 05 00H
定
char temp3
34H
4
char
"data"
char wave_data="data"
38H
4
long int
采样数据字节数
lont int size2=
文长
-60
3CH
到文尾
采样数据
表
6
SBC
(
Sub-Band Coding
子带编码)语音编码后的
WAV
文件头格式表(共
58
字节)
偏移地址
字节数
数据类型
内容
文件头定义为
00H
4
char
"RIFF"
char riff_id[4]="RIFF"
04H
4
long int
文件总长
-8
long int size0=
文总长
-8
08H
8
char
"WAVEfmt "
char wave_fmt[8]
10H
4
long int
12000000H(SBC)
long int size1=0x12
14H
2
int
71 00H
int fmttag=0x71
16H
2
int
声道数
int channel=1
或
2
18H
4
long int
采样率
long int samplespersec
1CH
4
long int
每秒播放字节数
long int bytepersec
20H
2
int
采样一次占字节数
int blockalign=0x25
22H
4
long int
量化数
long int bitpersamples=16
26H
4
char
"fact"
char wave_fact="fact"
2AH
8
char
0400000076280400H
定
char temp
32H
4
char
"data"
char wave_data="data"
36H
4
long int
采样数据字节数
lont int size2=
文长
-59
表
7
CELP(
Code Excited Linear Prediction
码激励线性预测编码——近
10
年来最成功的语音编码算
法
)
语音编码后的
WAV
文件头格式表(共
58
字节)
偏移地址
字节数
数据类型
内容
文件头定义为
00H
4
char
"RIFF"
char riff_id[4]="RIFF"
04H
4
long int
文件总长
-8
long int size0=
文总长
-8
08H
8
char
"WAVEfmt "
char wave_fmt[8]
10H
4
long int
12000000H(CELP)
long int size1=0x12
14H
2
int
70 00H
int fmttag=0x70
16H
2
int
声道数
int channel=1
或
2
18H
4
long int
采样率
long int samplespersec
1CH
4
long int
每秒播放字节数
long int bytepersec
20H
2
int
采样一次占字节数
int blockalign=0x0C
22H
4
long int
量化数
long int bitpersamples=16
26H
4
char
"fact"
char wave_fact="fact"
2AH
8
char
0400000060520700H
定
char temp
32H
4
char
"data"
char wave_data="data"
36H
4
long int
采样数据字节数
lont int size2=
文长
-58
概念
1
、
读取
WAV
文件,填写
WAVEFORMATEX
结构
WAVEFORMATEX
⑵
地址
04H-07H
,
值为
“64 5D E0 00”
,
存储的是文件大小刨去
8
字节后的值,
注意这个是
little-endian
的,也就是高地址存低位,地地址存高位,所以
Size=00E05D64H=14703972
字节,比文件总大小少
8
个字节,这
8
个字节就是
00H-07H
;
⑶
地址
08H-0FH
,就是
“WAVEfmt ”
标记;
⑷
地址
10H-13H
,
fmt
格式的块大小,这种格式时是
“10 00 00 00”
,也是
little-endian
的,即块大小
为
16
,也有可能为
18
,这时最后多了
2
个字节的附加信息。其他格式的可能是
20
;
⑸
地址
14H-15H
,
“01 00”
,也是
little-endian
的,标记编码方式,一般为
0x0001
;
⑹
地址
16H-17H
,
“01 00”
,也是
little-endian
,标记声道数,这里值为
1
。注意
1
代表单声道,
2
代
表双声道;
⑺
地址
18H-1BH
,
“44 AC 00 00”
,也是
little-endian
,标记采样频率,这里为
441000Hz
;
⑻
地址
1CH-1FH
,
“88 58
01 00”
每秒所需的字节数,也是
little-endian
,
bytepersec=00015888H=88200(
字节
)
。(加上点自己的看法
88200=
频率
*
采样一次占的字节数
=44100*2
,我觉得这种关系是存在的,虽然很多资料上没提到);
⑼
地址
20H-21H
,
“02 00”
,采样一次占字节数
,有些地方也叫数据块对齐单位,也是
little-endian
的,这里是两个字节。声道数
*
量化数
/8=1*16/8=2(
字节
)
;
⑽
地址
22H-23H
,
“10 00”
,量化数,也就是每个采样需要的
bit
数,也是
little-endian
的,所以这里
是
16
位;
⑾
地址
24H-27H
,
“64 61 74 61”
,就是
“data”
了;
⑿
地址
28H-2BH
,
“40 5D E0 00”
,
存储的是文件大小刨去
44
字节后的值,
这个也是
little-endian
的,
Size=00E05D40H=14703936
字节。
2
、编程方法
⑴
计算文件播放时长
文件播放时长
=(
文件总长度
-
文件头长度
)/
每秒所需的字节数。
如上例
duration=(14,703,980 -44)/88200=166.7s
,这个在
kugoo
的制作铃声功能下可以查询的到。
⑵
按时间点切割文件
(只精确到秒已用程序实现过,
精确到
0.1s
理论上也是可以,
但是没有用程序
去实现)。
①
切割文件的前
N
秒为一个新文件
第一步,计算
N
秒的偏移量,
SetOff=N*
每秒所需的字节数
第二步,算出新文件的大小,修改文件头的两个
size
值。
第三步,
新的文件头以二进制形式写入到新文件,
紧接着根据偏移量把原文件中的第
45
字节到
(setOff-1)
字节写入到新文件。
②
窃取中间某个时间段为一个新文件
这里可以根据①的步骤进行,同样的要修改文件头。
三、
wav
文件格式
WAV
为微软公司
(Microsoft)
开发的一种声音文件格式,文件作为多媒体中使用的声波文件格式
之一,
它是以
RIFF(Resource Interchange File Format)
格式为标准的。
每个
WAV
文件的头四个字节便
是
“RIFF”
。
WAV
文件由文件头和数据体两大部分组成。其中文件头又分为
RIFF/WAV
文件标识段
和声音数据格式说明段两部分,包含了音频流的编码参数。
WAV
对音频流的编码没有硬性规定,除了
PCM
(
Pulse Code Modulation
脉冲编码调制)之外,
还有几乎所有支持
ACM
规范的编码都可以为
WAV
的音频流进行编码,如
MP3
编码同样也可以运
用在
WAV
中,只要安装好了相应的
Decode
(指令解码),就可以欣赏这些
WAV
了。
在
windows
平台下,基于
PCM
编码的
WAV
是被支持得最好的音频格式,所有音频软件都能完
美支持,由于本身可以达到较高的音质要求,
因此,
WAV
也是音乐编辑创作的首选格式,适合保存
音乐素材。因此,基于
PCM
编码的
WAV
被作为了一种中介的格式,常常使用在其他编码的相互转
换之中,例如
MP3
转换成
WMA
。
WAV
文件可以存储大量格式的数据,通常采用的音频编码方式是脉冲编码调制
(PCM)
。由于
WAV
格式源自
Windows/Intel
环境,
因而采用
Little-Endian(
小字节序、
低字节序
)
字节顺序进行存储。
表
1
WAV
文件的文件头
偏移地址
字节数
类型
内容
00H~03H
4
字符
资源交换文件标志(
RIFF
)
04H~07H
4
长整数
从下个地址开始到文件尾的总字节数
08H~0BH
4
字符
WAV
文件标志(
WAVE
)
0CH~0FH
4
字符
波形格式标志(
FMT
)
10H~13H
4
整数
过滤字节(一般为
00000010H
)
14H~15H
2
整数
格式种类(值为
1
,表示数据
PCMμ
律编码的数据)
16H~17H
2
整数
通道数,单声道为
1
,双声音为
2
18H~1BH
4
长整数
采样频率
1CH~1FH
4
长整数
波形数据传输速率(每秒平均字节数)
20H~21H
2
整数
数据的调整数(按字节计算)
22H~23H
2
整数
样本数据位数
表
2
WAV
声音文件的数据块
偏移地址
字节数
类型
内容
24H~27H
4
字符
数据标志符(
data
)
28H~2BH
4
长整型
采样数据总数
2CH...
...
采样数据
WAV
文件作为最经典的
Windows
多媒体音频格式,应用非常广泛,它使用三个参数来表示声
音:
采样位数、
采样频率和声道数。
声道有单声道和立体声之分,
采样频率一般有
11025Hz
(
11kHz
)
、
22050Hz
(
22kHz
)和
44100Hz
(
44kHz
)三种。
WAV
文件所占容量
=
(采样频率
×
采样位数
×
声道)
×
时间
/8
(
1
字节
=8bit
)。
常见的
WAV
文件主要有两种,
分别对应于单声道
(11.025 kHz
采样率、
8 bit
的采样值
)
和双声道
(44.1 kHz
采样率、
16 bit
的采样值
)
。采样率是指声音信号在
“
模/数
”
转换过程中单位时间内采样的
次数。采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为
8
位的短整数
(short
int
00H
—
FFH)
;而对于双声道立体声声
音文件,每次采样数据为一个
16
位的整数
(int),
高八位和低八位分别代表左右两个声道。
WAV
文件数据块包含以脉冲编码调制
(PCM)
格式表示的样本,
WAV
文件是由样本组织而成的。
在单声道
WAV
文件中,声道
0
代表左声道,声道
1
代表右声道;在多声道
WAV
文件中,样本是
交替出现的。
表
3
WAV
文件格式说明
偏移地址
文件头
字节数
数据类型
内容
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
语音数据的长度
表
4
PCM
数据的存放方式
样本
1
样本
2
8
位单声道
0
声道
0
声道
8
位立体声
0
声道(左)
1
声道(右)
0
声道(左)
1
声道(右)
16
位单声道
0
声道低字节
0
声道高字节
0
声道低字节
0
声道高字节
16
位立体声
0
声道(左)低字节
0
声道(左)高字节
1
声道(右)低字节
1
声道(右)高字节
WAV
文件的每个样本值包含在一个整数
i
中,
i
的长度为容纳指定样本长度所需的最小字节数。
首先存储低有效字节,表示样本幅度的位放在
i
的高有效位上,剩下的位置为
0
,这样
8
位和
16
位
的
PCM
波形样本的数据格式如下所示。
样本大小
数据格式
最大值
最小值
8
位
PCM
unsigned int
225
0
16
位
PCM
int
32767
-32767
你可能喜欢
28H
8
char
6661637404000000H
定
char temp2
30H
4
char
40 E2 05 00H
定
char temp3
34H
4
char
"data"
char wave_data="data"
38H
4
long int
采样数据字节数
lont int size2=
文长
-60
3CH
到文尾
采样数据
表
6
SBC
(
Sub-Band Coding
子带编码)语音编码后的
WAV
文件头格式表(共
58
字节)
偏移地址
字节数
数据类型
内容
文件头定义为
00H
4
char
"RIFF"
char riff_id[4]="RIFF"
04H
4
long int
文件总长
-8
long int size0=
文总长
-8
08H
8
char
"WAVEfmt "
char wave_fmt[8]
10H
4
long int
12000000H(SBC)
long int size1=0x12
14H
2
int
71 00H
int fmttag=0x71
16H
2
int
声道数
int channel=1
或
2
18H
4
long int
采样率
long int samplespersec
1CH
4
long int
每秒播放字节数
long int bytepersec
20H
2
int
采样一次占字节数
int blockalign=0x25
22H
4
long int
量化数
long int bitpersamples=16
26H
4
char
"fact"
char wave_fact="fact"
2AH
8
char
0400000076280400H
定
char temp
32H
4
char
"data"
char wave_data="data"
36H
4
long int
采样数据字节数
lont int size2=
文长
-59
表
7
CELP(
Code Excited Linear Prediction
码激励线性预测编码——近
10
年来最成功的语音编码算
法
)
语音编码后的
WAV
文件头格式表(共
58
字节)
偏移地址
字节数
数据类型
内容
文件头定义为
00H
4
char
"RIFF"
char riff_id[4]="RIFF"
04H
4
long int
文件总长
-8
long int size0=
文总长
-8
08H
8
char
"WAVEfmt "
char wave_fmt[8]
10H
4
long int
12000000H(CELP)
long int size1=0x12
14H
2
int
70 00H
int fmttag=0x70
16H
2
int
声道数
int channel=1
或
2
18H
4
long int
采样率
long int samplespersec
1CH
4
long int
每秒播放字节数
long int bytepersec
20H
2
int
采样一次占字节数
int blockalign=0x0C
22H
4
long int
量化数
long int bitpersamples=16
26H
4
char
"fact"
char wave_fact="fact"
2AH
8
char
0400000060520700H
定
char temp
32H
4
char
"data"
char wave_data="data"
36H
4
long int
采样数据字节数
lont int size2=
文长
-58
概念
1
、
读取
WAV
文件,填写
WAVEFORMATEX
结构
WAVEFORMATEX
⑵
地址
04H-07H
,
值为
“64 5D E0 00”
,
存储的是文件大小刨去
8
字节后的值,
注意这个是
little-endian
的,也就是高地址存低位,地地址存高位,所以
Size=00E05D64H=14703972
字节,比文件总大小少
8
个字节,这
8
个字节就是
00H-07H
;
⑶
地址
08H-0FH
,就是
“WAVEfmt ”
标记;
⑷
地址
10H-13H
,
fmt
格式的块大小,这种格式时是
“10 00 00 00”
,也是
little-endian
的,即块大小
为
16
,也有可能为
18
,这时最后多了
2
个字节的附加信息。其他格式的可能是
20
;
⑸
地址
14H-15H
,
“01 00”
,也是
little-endian
的,标记编码方式,一般为
0x0001
;
⑹
地址
16H-17H
,
“01 00”
,也是
little-endian
,标记声道数,这里值为
1
。注意
1
代表单声道,
2
代
表双声道;
⑺
地址
18H-1BH
,
“44 AC 00 00”
,也是
little-endian
,标记采样频率,这里为
441000Hz
;
⑻
地址
1CH-1FH
,
“88 58
01 00”
每秒所需的字节数,也是
little-endian
,
bytepersec=00015888H=88200(
字节
)
。(加上点自己的看法
88200=
频率
*
采样一次占的字节数
=44100*2
,我觉得这种关系是存在的,虽然很多资料上没提到);
⑼
地址
20H-21H
,
“02 00”
,采样一次占字节数
,有些地方也叫数据块对齐单位,也是
little-endian
的,这里是两个字节。声道数
*
量化数
/8=1*16/8=2(
字节
)
;
⑽
地址
22H-23H
,
“10 00”
,量化数,也就是每个采样需要的
bit
数,也是
little-endian
的,所以这里
是
16
位;
⑾
地址
24H-27H
,
“64 61 74 61”
,就是
“data”
了;
⑿
地址
28H-2BH
,
“40 5D E0 00”
,
存储的是文件大小刨去
44
字节后的值,
这个也是
little-endian
的,
Size=00E05D40H=14703936
字节。
2
、编程方法
⑴
计算文件播放时长
文件播放时长
=(
文件总长度
-
文件头长度
)/
每秒所需的字节数。
如上例
duration=(14,703,980 -44)/88200=166.7s
,这个在
kugoo
的制作铃声功能下可以查询的到。
⑵
按时间点切割文件
(只精确到秒已用程序实现过,
精确到
0.1s
理论上也是可以,
但是没有用程序
去实现)。
①
切割文件的前
N
秒为一个新文件
第一步,计算
N
秒的偏移量,
SetOff=N*
每秒所需的字节数
第二步,算出新文件的大小,修改文件头的两个
size
值。
第三步,
新的文件头以二进制形式写入到新文件,
紧接着根据偏移量把原文件中的第
45
字节到
(setOff-1)
字节写入到新文件。
②
窃取中间某个时间段为一个新文件
这里可以根据①的步骤进行,同样的要修改文件头。
三、
wav
文件格式
WAV
为微软公司
(Microsoft)
开发的一种声音文件格式,文件作为多媒体中使用的声波文件格式
之一,
它是以
RIFF(Resource Interchange File Format)
格式为标准的。
每个
WAV
文件的头四个字节便
是
“RIFF”
。
WAV
文件由文件头和数据体两大部分组成。其中文件头又分为
RIFF/WAV
文件标识段
和声音数据格式说明段两部分,包含了音频流的编码参数。
WAV
对音频流的编码没有硬性规定,除了
PCM
(
Pulse Code Modulation
脉冲编码调制)之外,
还有几乎所有支持
ACM
规范的编码都可以为
WAV
的音频流进行编码,如
MP3
编码同样也可以运
用在
WAV
中,只要安装好了相应的
Decode
(指令解码),就可以欣赏这些
WAV
了。
在
windows
平台下,基于
PCM
编码的
WAV
是被支持得最好的音频格式,所有音频软件都能完
美支持,由于本身可以达到较高的音质要求,
因此,
WAV
也是音乐编辑创作的首选格式,适合保存
音乐素材。因此,基于
PCM
编码的
WAV
被作为了一种中介的格式,常常使用在其他编码的相互转
换之中,例如
MP3
转换成
WMA
。
WAV
文件可以存储大量格式的数据,通常采用的音频编码方式是脉冲编码调制
(PCM)
。由于
WAV
格式源自
Windows/Intel
环境,
因而采用
Little-Endian(
小字节序、
低字节序
)
字节顺序进行存储。
表
1
WAV
文件的文件头
偏移地址
字节数
类型
内容
00H~03H
4
字符
资源交换文件标志(
RIFF
)
04H~07H
4
长整数
从下个地址开始到文件尾的总字节数
08H~0BH
4
字符
WAV
文件标志(
WAVE
)
0CH~0FH
4
字符
波形格式标志(
FMT
)
10H~13H
4
整数
过滤字节(一般为
00000010H
)
14H~15H
2
整数
格式种类(值为
1
,表示数据
PCMμ
律编码的数据)
16H~17H
2
整数
通道数,单声道为
1
,双声音为
2
18H~1BH
4
长整数
采样频率
1CH~1FH
4
长整数
波形数据传输速率(每秒平均字节数)
20H~21H
2
整数
数据的调整数(按字节计算)
22H~23H
2
整数
样本数据位数
表
2
WAV
声音文件的数据块
偏移地址
字节数
类型
内容
24H~27H
4
字符
数据标志符(
data
)
28H~2BH
4
长整型
采样数据总数
2CH...
...
采样数据
WAV
文件作为最经典的
Windows
多媒体音频格式,应用非常广泛,它使用三个参数来表示声
音:
采样位数、
采样频率和声道数。
声道有单声道和立体声之分,
采样频率一般有
11025Hz
(
11kHz
)
、
22050Hz
(
22kHz
)和
44100Hz
(
44kHz
)三种。
WAV
文件所占容量
=
(采样频率
×
采样位数
×
声道)
×
时间
/8
(
1
字节
=8bit
)。
常见的
WAV
文件主要有两种,
分别对应于单声道
(11.025 kHz
采样率、
8 bit
的采样值
)
和双声道
(44.1 kHz
采样率、
16 bit
的采样值
)
。采样率是指声音信号在
“
模/数
”
转换过程中单位时间内采样的
次数。采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为
8
位的短整数
(short
int
00H
—
FFH)
;而对于双声道立体声声
音文件,每次采样数据为一个
16
位的整数
(int),
高八位和低八位分别代表左右两个声道。
WAV
文件数据块包含以脉冲编码调制
(PCM)
格式表示的样本,
WAV
文件是由样本组织而成的。
在单声道
WAV
文件中,声道
0
代表左声道,声道
1
代表右声道;在多声道
WAV
文件中,样本是
交替出现的。
表
3
WAV
文件格式说明
偏移地址
文件头
字节数
数据类型
内容
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
语音数据的长度
表
4
PCM
数据的存放方式
样本
1
样本
2
8
位单声道
0
声道
0
声道
8
位立体声
0
声道(左)
1
声道(右)
0
声道(左)
1
声道(右)
16
位单声道
0
声道低字节
0
声道高字节
0
声道低字节
0
声道高字节
16
位立体声
0
声道(左)低字节
0
声道(左)高字节
1
声道(右)低字节
1
声道(右)高字节
WAV
文件的每个样本值包含在一个整数
i
中,
i
的长度为容纳指定样本长度所需的最小字节数。
首先存储低有效字节,表示样本幅度的位放在
i
的高有效位上,剩下的位置为
0
,这样
8
位和
16
位
的
PCM
波形样本的数据格式如下所示。
样本大小
数据格式
最大值
最小值
8
位
PCM
unsigned int
225
0
16
位
PCM
int
32767
-32767
1234567890ABCDEFGHIJKLMNabcdefghijklmn!@#$%^&&*()_+.一三五七九贰肆陆扒拾,。青玉案元夕东风夜放花千树更吹落星如雨宝马雕车香满路凤箫声动玉壶光转一夜鱼龙舞蛾儿雪柳黄金缕笑语盈盈暗香去众里寻他千百度暮然回首那人却在灯火阑珊处
你可能喜欢
28H
8
char
6661637404000000H
定
char temp2
30H
4
char
40 E2 05 00H
定
char temp3
34H
4
char
"data"
char wave_data="data"
38H
4
long int
采样数据字节数
lont int size2=
文长
-60
3CH
到文尾
采样数据
表
6
SBC
(
Sub-Band Coding
子带编码)语音编码后的
WAV
文件头格式表(共
58
字节)
偏移地址
字节数
数据类型
内容
文件头定义为
00H
4
char
"RIFF"
char riff_id[4]="RIFF"
04H
4
long int
文件总长
-8
long int size0=
文总长
-8
08H
8
char
"WAVEfmt "
char wave_fmt[8]
10H
4
long int
12000000H(SBC)
long int size1=0x12
14H
2
int
71 00H
int fmttag=0x71
16H
2
int
声道数
int channel=1
或
2
18H
4
long int
采样率
long int samplespersec
1CH
4
long int
每秒播放字节数
long int bytepersec
20H
2
int
采样一次占字节数
int blockalign=0x25
22H
4
long int
量化数
long int bitpersamples=16
26H
4
char
"fact"
char wave_fact="fact"
2AH
8
char
0400000076280400H
定
char temp
32H
4
char
"data"
char wave_data="data"
36H
4
long int
采样数据字节数
lont int size2=
文长
-59
表
7
CELP(
Code Excited Linear Prediction
码激励线性预测编码——近
10
年来最成功的语音编码算
法
)
语音编码后的
WAV
文件头格式表(共
58
字节)
偏移地址
字节数
数据类型
内容
文件头定义为
00H
4
char
"RIFF"
char riff_id[4]="RIFF"
04H
4
long int
文件总长
-8
long int size0=
文总长
-8
08H
8
char
"WAVEfmt "
char wave_fmt[8]
10H
4
long int
12000000H(CELP)
long int size1=0x12
14H
2
int
70 00H
int fmttag=0x70
16H
2
int
声道数
int channel=1
或
2
18H
4
long int
采样率
long int samplespersec
1CH
4
long int
每秒播放字节数
long int bytepersec
20H
2
int
采样一次占字节数
int blockalign=0x0C
22H
4
long int
量化数
long int bitpersamples=16
26H
4
char
"fact"
char wave_fact="fact"
2AH
8
char
0400000060520700H
定
char temp
32H
4
char
"data"
char wave_data="data"
36H
4
long int
采样数据字节数
lont int size2=
文长
-58
概念
1
、
读取
WAV
文件,填写
WAVEFORMATEX
结构
WAVEFORMATEX
⑵
地址
04H-07H
,
值为
“64 5D E0 00”
,
存储的是文件大小刨去
8
字节后的值,
注意这个是
little-endian
的,也就是高地址存低位,地地址存高位,所以
Size=00E05D64H=14703972
字节,比文件总大小少
8
个字节,这
8
个字节就是
00H-07H
;
⑶
地址
08H-0FH
,就是
“WAVEfmt ”
标记;
⑷
地址
10H-13H
,
fmt
格式的块大小,这种格式时是
“10 00 00 00”
,也是
little-endian
的,即块大小
为
16
,也有可能为
18
,这时最后多了
2
个字节的附加信息。其他格式的可能是
20
;
⑸
地址
14H-15H
,
“01 00”
,也是
little-endian
的,标记编码方式,一般为
0x0001
;
⑹
地址
16H-17H
,
“01 00”
,也是
little-endian
,标记声道数,这里值为
1
。注意
1
代表单声道,
2
代
表双声道;
⑺
地址
18H-1BH
,
“44 AC 00 00”
,也是
little-endian
,标记采样频率,这里为
441000Hz
;
⑻
地址
1CH-1FH
,
“88 58
01 00”
每秒所需的字节数,也是
little-endian
,
bytepersec=00015888H=88200(
字节
)
。(加上点自己的看法
88200=
频率
*
采样一次占的字节数
=44100*2
,我觉得这种关系是存在的,虽然很多资料上没提到);
⑼
地址
20H-21H
,
“02 00”
,采样一次占字节数
,有些地方也叫数据块对齐单位,也是
little-endian
的,这里是两个字节。声道数
*
量化数
/8=1*16/8=2(
字节
)
;
⑽
地址
22H-23H
,
“10 00”
,量化数,也就是每个采样需要的
bit
数,也是
little-endian
的,所以这里
是
16
位;
⑾
地址
24H-27H
,
“64 61 74 61”
,就是
“data”
了;
⑿
地址
28H-2BH
,
“40 5D E0 00”
,
存储的是文件大小刨去
44
字节后的值,
这个也是
little-endian
的,
Size=00E05D40H=14703936
字节。
2
、编程方法
⑴
计算文件播放时长
文件播放时长
=(
文件总长度
-
文件头长度
)/
每秒所需的字节数。
如上例
duration=(14,703,980 -44)/88200=166.7s
,这个在
kugoo
的制作铃声功能下可以查询的到。
⑵
按时间点切割文件
(只精确到秒已用程序实现过,
精确到
0.1s
理论上也是可以,
但是没有用程序
去实现)。
①
切割文件的前
N
秒为一个新文件
第一步,计算
N
秒的偏移量,
SetOff=N*
每秒所需的字节数
第二步,算出新文件的大小,修改文件头的两个
size
值。
第三步,
新的文件头以二进制形式写入到新文件,
紧接着根据偏移量把原文件中的第
45
字节到
(setOff-1)
字节写入到新文件。
②
窃取中间某个时间段为一个新文件
这里可以根据①的步骤进行,同样的要修改文件头。
三、
wav
文件格式
WAV
为微软公司
(Microsoft)
开发的一种声音文件格式,文件作为多媒体中使用的声波文件格式
之一,
它是以
RIFF(Resource Interchange File Format)
格式为标准的。
每个
WAV
文件的头四个字节便
是
“RIFF”
。
WAV
文件由文件头和数据体两大部分组成。其中文件头又分为
RIFF/WAV
文件标识段
和声音数据格式说明段两部分,包含了音频流的编码参数。
WAV
对音频流的编码没有硬性规定,除了
PCM
(
Pulse Code Modulation
脉冲编码调制)之外,
还有几乎所有支持
ACM
规范的编码都可以为
WAV
的音频流进行编码,如
MP3
编码同样也可以运
用在
WAV
中,只要安装好了相应的
Decode
(指令解码),就可以欣赏这些
WAV
了。
在
windows
平台下,基于
PCM
编码的
WAV
是被支持得最好的音频格式,所有音频软件都能完
美支持,由于本身可以达到较高的音质要求,
因此,
WAV
也是音乐编辑创作的首选格式,适合保存
音乐素材。因此,基于
PCM
编码的
WAV
被作为了一种中介的格式,常常使用在其他编码的相互转
换之中,例如
MP3
转换成
WMA
。
WAV
文件可以存储大量格式的数据,通常采用的音频编码方式是脉冲编码调制
(PCM)
。由于
WAV
格式源自
Windows/Intel
环境,
因而采用
Little-Endian(
小字节序、
低字节序
)
字节顺序进行存储。
表
1
WAV
文件的文件头
偏移地址
字节数
类型
内容
00H~03H
4
字符
资源交换文件标志(
RIFF
)
04H~07H
4
长整数
从下个地址开始到文件尾的总字节数
08H~0BH
4
字符
WAV
文件标志(
WAVE
)
0CH~0FH
4
字符
波形格式标志(
FMT
)
10H~13H
4
整数
过滤字节(一般为
00000010H
)
14H~15H
2
整数
格式种类(值为
1
,表示数据
PCMμ
律编码的数据)
16H~17H
2
整数
通道数,单声道为
1
,双声音为
2
18H~1BH
4
长整数
采样频率
1CH~1FH
4
长整数
波形数据传输速率(每秒平均字节数)
20H~21H
2
整数
数据的调整数(按字节计算)
22H~23H
2
整数
样本数据位数
表
2
WAV
声音文件的数据块
偏移地址
字节数
类型
内容
24H~27H
4
字符
数据标志符(
data
)
28H~2BH
4
长整型
采样数据总数
2CH...
...
采样数据
WAV
文件作为最经典的
Windows
多媒体音频格式,应用非常广泛,它使用三个参数来表示声
音:
采样位数、
采样频率和声道数。
声道有单声道和立体声之分,
采样频率一般有
11025Hz
(
11kHz
)
、
22050Hz
(
22kHz
)和
44100Hz
(
44kHz
)三种。
WAV
文件所占容量
=
(采样频率
×
采样位数
×
声道)
×
时间
/8
(
1
字节
=8bit
)。
常见的
WAV
文件主要有两种,
分别对应于单声道
(11.025 kHz
采样率、
8 bit
的采样值
)
和双声道
(44.1 kHz
采样率、
16 bit
的采样值
)
。采样率是指声音信号在
“
模/数
”
转换过程中单位时间内采样的
次数。采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为
8
位的短整数
(short
int
00H
—
FFH)
;而对于双声道立体声声
音文件,每次采样数据为一个
16
位的整数
(int),
高八位和低八位分别代表左右两个声道。
WAV
文件数据块包含以脉冲编码调制
(PCM)
格式表示的样本,
WAV
文件是由样本组织而成的。
在单声道
WAV
文件中,声道
0
代表左声道,声道
1
代表右声道;在多声道
WAV
文件中,样本是
交替出现的。
表
3
WAV
文件格式说明
偏移地址
文件头
字节数
数据类型
内容
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
语音数据的长度
表
4
PCM
数据的存放方式
样本
1
样本
2
8
位单声道
0
声道
0
声道
8
位立体声
0
声道(左)
1
声道(右)
0
声道(左)
1
声道(右)
16
位单声道
0
声道低字节
0
声道高字节
0
声道低字节
0
声道高字节
16
位立体声
0
声道(左)低字节
0
声道(左)高字节
1
声道(右)低字节
1
声道(右)高字节
WAV
文件的每个样本值包含在一个整数
i
中,
i
的长度为容纳指定样本长度所需的最小字节数。
首先存储低有效字节,表示样本幅度的位放在
i
的高有效位上,剩下的位置为
0
,这样
8
位和
16
位
的
PCM
波形样本的数据格式如下所示。
样本大小
数据格式
最大值
最小值
8
位
PCM
unsigned int
225
0
16
位
PCM
int
32767
-32767
你可能喜欢
最后
以上就是呆萌胡萝卜为你收集整理的wav 文件头解析的全部内容,希望文章能够帮你解决wav 文件头解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
- 本文分类:Other
- 浏览次数:65 次浏览
- 发布日期:2023-11-23 03:45:02
- 本文链接:https://www.kaopuke.com/article/k-p-k_13_u_23_o_10_fx_13_jkz.html
发表评论 取消回复