WAV音频文件格式分析

用notepad++>>plugins>>HexEditor(notepad++的一个二进制编辑器插件——可以以16进制查看文件内容)打开一个波形文件如下:
在这里插入图片描述
所有WAV波形文件都可以套用一下一下格式
在这里插入图片描述
对应图一可以看到:
文件前部分
文件末尾

  • 结构辨识码:该文件是属于RIFF结构的文件,这种结构是一种树状结构,其最基本的组成单元是chunk(块),而每一个chunk则由辨识码,数据大小,以及数据本身组成。
  • 数据大小:需要注意目前很多的CPU存储数据都是采用小端的方式,即低位在前,高位在后。实际的数据大小是00 00 7d 24,对应文件最后一个地址为00 00 7d 2b,(00 00 7d 2b - 00 00 7d 24 = 8),刚好是结构辨识码 + 数据大小的信息位宽,说明该文件的数据大小是从00 00 00 08开始算起。
  • 格式识别码:该文件是WAV格式的文件。每个识别码都是由4字节的数据表示,每一个字节的数据都之间用ASCII码映射成相应的符号,例如57 41 56 45==“WAVE”。
  • fmt子块:主要用于描述该wav文件的信息,辨识符是66 6D 74 20,后接子块大小00 00 00 10(10 00 00 00),说明fmt数据有16个字节,如图蓝色框中的数据。子块数据的字节长度是由子块长度的内容决定的。
  • fact子块:该块并不是必须的,在PCM(Pulse-Code Modulation,脉冲编码调制)——一种标准未压缩的编码格式,的WAV文件中没有该子块,只有一些软件转化而来的才会增加该子块,其主要存储的信息包括采样的数量等。从文件数据中也可以看出,在上述数据之后接的并不是fact子块的辩识码,而是data子块的辨识码(64 61 74 61),说明该文件确实不存在fact子块。
  • data子块:主要就是WAV文件真正能播放的声音数据部分。该块的数据大小00 00 7d 00(00 7d 00 00),00 00 7d 2b - 00 00 00 2b = 00 00 7d 00,刚好是接下来到文件最后的所有数据长度总和,即粉红色宽中真正有效可播放的音频数据。2个字节一个有效信息,当数据是双声道时,其存储方式为一个左声道,一个右声道…如此循环。

fmt子块中的数据

其中的16个字节的信息包括采样率,数据量,编码格式,声道数等内容如下:
在这里插入图片描述

由上表可以看出,在PCM模式下不包含最后两个附加数据,其余所有数据的字节总和刚好是16Byte。在ADPCM音频模式下,fmt子块长度应为20Byte。由于在该文件并不存在fact子块的信息,在此不做深入的调研了。
综上所述,准确地说,WAVE文件=文件头(结构辨识码+数据大小+格式辨识码) + 各子块内容(子块辨识码+子块长度+子块数据)。但仔细理解又可以这样分类,除了data子块中的子块数据是真正的可播放的音频数据之外,其余的都是与该文件或者音频相关的信息,可以伪归类为文件头,在获取WAV文件信息时,可以定义一个结构体变量如下,读取文件头的信息。

typedef struct // WAV stores wave file header
{
  int32_t rId;//文件结构辨识码(RIFF)
  int32_t rLen;//数据大小
  int32_t rId;//文件格式辨识码(WAVE)
  
  int32_t fId;//子块辨识码(FMT)
  int32_t fLen;//子块长度

  int16_t wFormatTag;//编码格式
  int16_t nChannels;//声道数
  int32_t nSamplesPerSec;//采样频率
  int32_t nAvgBytesPerSec;//字节速率
  int16_t nBlockAlign;//块对齐
  int16_t wBitsPerSample;//量化位数
  //int16_t ByteExtraData;//附加的数据字节
  //int16_t ExtraData;//附加单个采样数据块大小
  
  int32_t dId;//子块辨识码(DATA)
  int32_t dLen;//波形声音字节数
} WAV;
//读取文件
sourcefile = fopen("../speech/right/3c165869_nohash_1.wav", "rb");
fread(&header, sizeof(WAV), 1, sourcefile);
fread(&buffer, sizeof(int16_t), dLen, sourcefile);
fclose(sourcefile);

文章参考“分析WAV音频文件”——https://zhuanlan.zhihu.com/p/45518641

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值