守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 452|回复: 0

[音频分析] WAVE 文件格式分析

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51792
    钢镚
    1422

    开源英雄守望者

    发表于 2015-4-29 16:22:29 | 显示全部楼层 |阅读模式
    WAVE 文件作为多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的。每个WAVE文件的头四个字节便是“RIFF”。WAVE 文件由文件头和数据体两大部分组成。其中文件头又分为 RIFF/WAV 文件标识段和声音数据格式说明段两部分。WAVE文件各部分内容及格式见后文。
    常见的声音文件主要有两种,分别对应于单声道(11.025KHz 采样率、8Bit 的采样值)和双声道(44.1KHz 采样率、16Bit 的采样值)。采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期
    内声音模拟信号的积分值。
    对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。
    WAVE 文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE 文件是由样本组织而成的。在单声道 WAVE 文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本是交替出现的。
    WAVE 文件除了前面一小段文件头对数据组织进行说明之外,Data 块就是声音的原始采样数据,WAVE 文件虽然可以压缩,但一般都使用不压缩的格式。44.1KHz 采样率、16Bit的分辨率、双声道,所以WAVE可以保存音质要求非常高的声音文件,CD 采用的也是这种格式,声音方面的专家或是音乐发烧友们应该非常熟悉。但这种文件的体积也非常大,以 44.1KHz 16bit 双声道的数据为例,一分钟的声音数据量为:4100*2byte*2channel*60s/1024/1024=10.09M 。所以不合适在网上传送。

    下面我们具体地分析 WAVE 文件的格式
    endian
    field name
    Size
    big
    ChunkID
    4
    文件头标识,一般就是" RIFF" 四个字母
    little
    ChunkSize
    4
    整个数据文件的大小,不包括上面ID和Size本身
    big
    Format
    4
    一般就是" WAVE" 四个字母
    big
    SubChunk1ID
    4
    格式说明块,本字段一般就是"fmt "
    little
    SubChunk1Size
    4
    本数据块的大小,不包括ID和Size字段本身
    little
    AudioFormat
    2
    音频的格式说明
    little
    NumChannels
    2
    声道数
    little
    SampleRate
    4
    采样率
    little
    ByteRate
    4
    比特率,每秒所需要的字节数
    little
    BlockAlign
    2
    数据块对齐单元
    little
    BitsPerSample
    2
    采样时模数转换的分辨率
    big
    SubChunk2ID
    4
    真正的声音数据块,本字段一般是"data"
    little
    SubChunk2Size
    4
    本数据块的大小,不包括ID和Size字段本身
    little
    Data
    N
    音频的采样数据

    以下是对各个字段的详细解说:
    ChunkID4bytesASCII 码表示的“RIFF”。(0x52494646)
    ChunkSize4bytes36+SubChunk2Size,或是
    4 + ( 8 + SubChunk1Size ) + ( 8 + SubChunk2Size ),
    这是整个数据块的大小(不包括ChunkID和ChunkSize的大小)
    Format4bytesASCII 码表示的“WAVE”。(0x57415645)
    SubChunk1ID新的数据块(格式信息说明块)
    ASCII 码表示的“fmt ”——最后是一个空格。(0x666d7420)
    SubChunk1Size4bytes本块数据的大小(对于PCM,值为16)。
    AudioFormat2bytesPCM = 1 (比如,线性采样),如果是其它值的话,则可能是一些压缩形式
    NumChannels2bytes1 => 单声道  |  2 => 双声道
    SampleRate4bytes采样率,如 8000,44100 等值
    ByteRate4bytes等于: SampleRate * numChannels * BitsPerSample / 8
    BlockAlign2bytes等于:NumChannels * BitsPerSample / 8
    BitsPerSample2bytes采样分辨率,也就是每个样本用几位来表示,一般是 8bits 或是 16bits
    SubChunk2ID4bytes新数据块,真正的声音数据
    ASCII 码表示的“data ”——最后是一个空格。(0x64617461)
    SubChunk2Size4bytes数据大小,即,其后跟着的采样数据的大小。
    DataN bytes真正的声音数据
    对于Data块,根据声道数和采样率的不同情况,布局如下(每列代表8bits):
    1. 8 Bit 单声道:
    采样1采样2
    数据1数据2
    2. 8 Bit 双声道
    采样1采样2
    声道1数据1声道2数据1声道1数据2声道2数据2
    1. 16 Bit 单声道:
    采样1采样2
    数据1低字节数据1高字节数据1低字节数据1高字节
    2. 16 Bit 双声道
    采样1
    声道1数据1低字节声道1数据1高字节声道2数据1低字节声道2数据1高字节
    采样2
    声道1数据2低字节声道1数据2高字节声道2数据2低字节声道2数据2高字节

    下面我们看一个具体的例子,声音文件如下:

    1. 52 49 46 46 24 08 00 00 57 41 56 45
    2. 66 6d 74 20 10 00 00 00 01 00 02 00
    3. 22 56 00 00 88 58 01 00 04 00 10 00
    4. 64 61 74 61 00 08 00 00 00 00 00 00
    5. 24 17 1e f3 3c 13 3c 14 16 f9 18 f9
    6. 34 e7 23 a6 3c f2 24 f2 11 ce 1a 0d
    复制代码
    对应的分析如下图所示:



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-11-21 10:52 , Processed in 0.063036 second(s), 33 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表