我是靠谱客的博主 呆萌胡萝卜,这篇文章主要介绍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 

 

 

 

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 

 

 

 

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 

 

 

 

1234567890ABCDEFGHIJKLMNabcdefghijklmn!@#$%^&&*()_+.一三五七九贰肆陆扒拾,。青玉案元夕东风夜放花千树更吹落星如雨宝马雕车香满路凤箫声动玉壶光转一夜鱼龙舞蛾儿雪柳黄金缕笑语盈盈暗香去众里寻他千百度暮然回首那人却在灯火阑珊处

你可能喜欢

最后

以上就是呆萌胡萝卜最近收集整理的关于wav 文件头解析的全部内容,更多相关wav内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(255)

评论列表共有 0 条评论

立即
投稿
返回
顶部