0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

WAV文件格式详解

嵌入式那些事 来源:嵌入式那些事 2023-10-21 09:52 次阅读

1、WAV文件概述

WAV是微软公司开发的一种音频格式文件,用于保存Windows平台的音频信息资源,它符合资源互换文件格式(Resource Interchange File Format,RIFF)文件规范。标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几!

WAV通常用来保存PCM格式的原始音频数据,所以通常被称为无损音频。但是严格意义上来讲,WAV也可以存储其它压缩格式的音频数据。

2、WAV文件格式

WAV符合RIFF文件格式标准,可以看作是RIFF文件的一个具体实例。既然WAV符合RIFF规范,其基本的组成单元也是chunk。一个WAV文件通常有三个chunk以及一个可选chunk,其在文件中的排列方式依次是:RIFF chunk,Format chunk,Fact chunk(附加块,可选),Data chunk。示意图如下:

e3a6363e-6d8a-11ee-939d-92fbcf53809c.png

2019-10-21_162529

一个WAV文件,首先是一个RIFF chunk,其格式类型为'WAVE'。RIFF chunk包括两个子chunk,ID分别为 'fmt '和'data',还有一个可选的Fact chunk。Format chunk用于表示音频数据的属性,包括编码方式、声道数目、采样频率、每个采样需要的bit数等等信息。Fact chunk是一个可选chunk,一般当WAVE文件由某些软件转化而成就包含Fact chunk。Data chunk包含WAVE文件的数字化波形声音数据。WAVE整体结构如下图所示:

e3b0fb50-6d8a-11ee-939d-92fbcf53809c.png

2019-10-21_162508

接下来讲讲各个chunk的具体内容。

3、各个chunk的具体内容

(1).RIFF chunk

ID:4字节,值为"RIFF"。

Size:4字节,ChunkData字段中数据的大小,单位:字节。

ChunkData:包含FormType和其他chunk的内容。

FormType:4字节,值为"WAVE"。

Data:其他chunk的内容。

(2).Format chunk

ID:4字节,值为"fmt ",最后一个字符是空格。

Size:4字节,数据字段(Data)包含的数据大小。如无扩展块,则值为16;有扩展块,则值为= 16 + 2字节扩展块长度 + 扩展块内容,或者值为18(只有扩展块长度为2字节,并且扩展块长度值为0),单位:字节。

Data:存放音频格式、声道数、采样率等信息。

audio_format:2字节,表示音频数据的格式。如值为1,表示使用PCM格式。

channels:2字节,声道数。值为1则为单声道,为2则是双声道。

sample_rate:4字节,采样频率,主要有22.05KHz,44.1kHz和48KHz等,例如0xAC44表示44100Hz。

bytes_per_sec:4字节,音频的码率,每秒播放的字节数。其值为:声道数 * 采样频率 * 量化位数 / 8,可以估算出使用缓冲区的大小。

block_align:2字节,每个采样点所需的字节数,其值为:声道数 * 量化位数 / 8。

bits_per_sample:2字节,量化位数,有16位,24位和32位等。

cbSize:2字节,扩展块的长度,其值可以为0或者22。

cbContent:0字节或22字节,扩展块内容,具体介绍在下文提及。

备注:这个区域只需要关心channels,sample_rate,bits_per_sample三个参数就可以了,其它的都是依据这三个计算出来的。

(3).Fact chunk(可选)

fact chunk为可选的,在大多数的WAV文件中是不存在的。采用压缩编码的WAV文件,必须要有Fact chunk,该块中只有一个数据,为每个声道的采样总数。

ID:4字节,值为"fact"。

Size:4字节,数据字段的长度,其值最小为4。

Data:采样总数。

(4).Data chunk

ID:4字节,值为"data"。

Size:4字节,音频数据的长度。

Data:具体的音频数据内容存放在这里。

4、Format chunk中的音频数据格式

在format chunk中,有一个字段audio_format,该字段表示音频数据是以何种方式进行编码存放的。其可选的取值有:

0x0001:WAVE_FORMAT_PCM,采用PCM格式,此时WAV文件中不包含Fact chunk。

0x0002:WAVE_FORMAT_ADPCM,此时WAV文件中包含Fact chunk。

0x0006:WAVE_FORMAT_ALAW,此时WAV文件中包含Fact chunk。

0x0007:WAVE_FORMAT_MULAW,此时WAV文件中包含Fact chunk。

0xFFFE:WAVE_FORMAT_EXTENSIBLE,具体的编码方式由Format chunk中扩展块的sub_format字段决定。

备注:一般情况下,我们遇到的WAV文件的音频数据编码格式是PCM,介绍上述内容,只是让大家多了解下其他的编码格式的值与名称,当遇到这类编码时,能够知道其名称,从而方便查询相关资料

5、Format chunk中的扩展块

当WAV文件使用的不是PCM编码方式时,就需要扩展格式块,它是在基本的Format chunk中又添加一段数据。该数据的前两个字节,表示的是扩展块的长度。紧接其后的是扩展块的数据区,含有扩展的格式信息,其具体的长度取决于压缩编码的类型。当某种编码方式的扩展块的数据区长度为0,此时扩展块只包含了扩展块长度字段,扩展块的长度字段还必须保留,只是其值设置为0。

扩展块的各个字节的含义如下:

cbSize:2字节,扩展块的长度,其值可以为0或者22。

cbContent:0字节或22字节,扩展块内容。

valid_bits_per_sample:2字节,有效的采样位数,最大值为block_align * 8。可以使用更灵活的量化位数,通常音频sample的量化位数为8的倍数,但是使用了WAVE_FORMAT_EXTENSIBLE时,量化的位数由扩展块中的valid_bits_per_sample来描述,可以小于Format chunk中指定的bits_per_sample。

channle_mask:4字节,声道掩码。

sub_format:16字节,数据格式码。

在Format chunk中的audio_format设置为0xFFFE时,表示使用扩展区中的sub_format来决定音频的数据的编码方式。在以下几种情况下必须要使用WAVE_FORMAT_EXTENSIBLE:

PCM数据的量化位数大于16。

音频的采样声道大于2。

实际的量化位数不是8的倍数。

存储顺序和播放顺序不一致,需要指定从声道顺序到声卡播放顺序的映射情况。

备注:一般情况下,我们遇到的WAV文件中是不含有扩展块的。

6、声音数据格式

Data chunk中的Data块中存放的是音频的采样数据。每个sample按照采样的时间顺序写入,对于使用多个字节的sample,使用小端模式存放(低位字节存放在低地址,高位字节存放在高地址)。对于多声道的sample采用交叉存放的方式。例如:立体双声道的sample存储顺序为:声道1的第一个sample,声道2的第一个sample;声道1的第二个sample,声道2的第二个sample;依次类推....。

对于Data chunk中的Data字段,也就是音频数据内容的存储,根据声道数和采样位数的不同情况,布局如下(每1列代表8 bits):

(1).8 bit单声道

采样1 采样2
数据1 数据2

(2).8 bit双声道

采样1 采样2
声道1数据1 声道2数据1 声道1数据2 声道2数据2

(3).16 bit单声道

采样1 采样2
数据1低字节 数据1高字节 数据2低字节 数据2高字节

(4).16 bit双声道

声道1采样1 声道2采样1
声道1数据1低字节 声道1数据1高字节 声道2数据1低字节 声道2数据1高字节
声道1采样2 声道2采样2
声道1数据2低字节 声道1数据2高字节 声道2数据2低字节 声道2数据2高字节

7、WAV文件实例分析

利用winhex工具软件可以非常方便的以十六进制查看文件,下图是我用winhex软件打开一个WAV音频文件时的部分界面截图:

e3bb4196-6d8a-11ee-939d-92fbcf53809c.png

2019-10-21_160033

下表对文件格式进行解读:

偏移地址 字节数 16进制源码 内容
00H 4 52 49 46 46 'RIFF'标识符
04H 4 F4 FE 83 01 数据长度:0x0183FEF4(注意顺序)
08H 4 57 41 56 45 'WAVE'标识符
0CH 4 66 6D 74 20 'fmt ',最后一位为空格
10H 4 10 00 00 00 Format chunk大小:0x10
14H 2 01 00 编码格式:0x01为PCM
16H 2 02 00 声道数目:0x02为双声道
18H 4 44 AC 00 00 采样频率:0xAC44表示44100Hz
1CH 4 10 B1 02 00 每秒字节数:0x02B110
20H 2 04 00 每个采样点所需的字节数:0x04
22H 2 10 00 量化位数:0x10
24H 4 64 61 74 61 'data'标识符
28H 4 48 FE 83 01 音频数据的长度:0x0183FE48

从偏移量2CH开始就是音频数据了。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 音频
    +关注

    关注

    29

    文章

    2870

    浏览量

    81497
  • WAV
    WAV
    +关注

    关注

    0

    文章

    22

    浏览量

    19148
  • 编码
    +关注

    关注

    6

    文章

    942

    浏览量

    54814
  • 文件
    +关注

    关注

    1

    文章

    565

    浏览量

    24732

原文标题:WAV文件格式详解

文章出处:【微信号:嵌入式那些事,微信公众号:嵌入式那些事】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于DWC2的USB驱动开发-UAC之WAV-PCM音频文件格式详解

    在做UAC,PWM音频播放的项目,需要解析WAV格式文件,通过UAC发送,或接收PCM数据,驱动喇叭播放。这里对WAV文件格式相关内容进行整理备忘。
    的头像 发表于 07-27 09:02 2193次阅读
    基于DWC2的USB驱动开发-UAC之<b class='flag-5'>WAV</b>-PCM音频<b class='flag-5'>文件格式</b><b class='flag-5'>详解</b>

    RIFF文件格式简介

    RIFF(Resources Interchange File Format)中文翻译为资源互换文件格式,是Windows下大部分多媒体文件遵循的一种文件结构。
    的头像 发表于 10-07 16:25 1729次阅读
    RIFF<b class='flag-5'>文件格式</b>简介

    MP3 文件格式资料

    MP3 文件格式资料
    发表于 04-08 03:37 22次下载

    如何光绘输出AutoCAD文件格式

    教你光绘输出AutoCAD文件格式
    发表于 06-07 15:16 36次下载

    .mpp文件格式打开软件下载

    .mpp文件格式打开
    发表于 07-07 13:14 2517次下载

    适用于IPTV大并发应用的文件格式

    分析交互式网络电视(IPTV)大并发应用的特性,提出一种适用于IPTV大并发应用的服务器内部文件格式cl4文件格式。该文件格式采用了符合IPTV大并发应用特性的音视频数据交织、媒体数
    发表于 04-15 10:02 17次下载

    LabVIEW数据文件格式的视频教程

    LabVIEW数据文件格式的视频教程 LabVIEW数据文件格式之华山论
    发表于 03-26 12:16 113次下载

    数码相机伴侣的文件格式

    数码相机伴侣的文件格式              文件格式指的是数码相机伴侣独特的文件系统结构在
    发表于 12-23 10:05 876次阅读

    GIF图形文件格式文档

    GIF图形文件格式文档 GIF图形文件格式文档 GIF图形文件格式文档
    发表于 05-24 10:53 2次下载

    GIF文件格式详解

    GIF文件格式详解 GIF文件格式详解 GIF文件格式详解
    发表于 05-24 10:53 2次下载

    了解LabVIEW数据文件格式

    LabVIEW数据文件格式之华山论剑视频教程
    的头像 发表于 06-25 00:13 4831次阅读
    了解LabVIEW数据<b class='flag-5'>文件格式</b>

    一招教你快速解析WAV文件格式

    语音的播放出现问题。由于WAV采用PCM编码,音质也十分不错,于是考虑用STM32对WAV格式音频文件进行解码,上周末开始找资料和编程,其中也遇到了不少问题,不过功夫不负有心人,最终还
    的头像 发表于 08-01 09:38 2.4w次阅读
    一招教你快速解析<b class='flag-5'>WAV</b><b class='flag-5'>文件格式</b>

    STM32--hex文件格式

        hex 是 Intel 公司制定的一种使用 ASCII 文本记录机器码或常量数据的文件格式,它可以烧录到MCU中,被MCU执行的一种文件格式。一个hex文件由多条记录组成,而每条记录由5个
    发表于 12-06 11:21 4次下载
    STM32--hex<b class='flag-5'>文件格式</b>

    常用对象文件格式

    电子发烧友网站提供《常用对象文件格式.pdf》资料免费下载
    发表于 10-15 09:25 0次下载
    常用对象<b class='flag-5'>文件格式</b>

    EPS文件格式如何转换 EPS和SVG文件的区别

    EPS文件格式转换 EPS(Encapsulated PostScript)是一种用于存储矢量图形的文件格式,最初由Adobe公司开发。由于EPS文件在打印时能够保持极高的质量,并且广泛被各种
    的头像 发表于 11-19 10:31 415次阅读