Wav文件结构

WAV Format

Wav文件大致结构、文件头各字节数据如上图所示。

其中文件头尺寸为44字节。

读取文件

根据上图中的数据格式,读取输入文件的前44字节来获取音频的属性。

获取时间与字节的对应关系

根据时间来裁剪音频文件时,需要知道音频时间对应的字节位置。

要想获取这个数值,有两个需要关心的值:ByteRateBlockAlign

  • ByteRate(比特率)

    ByteRate记录了每秒钟对应的字节数量,可以从文件头的 $[24, 28)$ 字节中读取。

  • BlockAlign

    BlockAlign记录了一个音频采样数据的字节尺寸,用于在读写时进行对齐,防止读取或写入错误的数据。

计算字节位置

成功获取ByteRateBlockAlign后,我们就可以开始计算对应时间的字节起始位置了。

对于一个确定的时间点time(以ms为单位),计算方式如下:

$BytePosition={ByteRate\times{time} - (ByteRate\times{time}\mod{BlockAlign})}$

根据这个公式分别计算起始位置和结束位置

将两点间的字节复制到新的文件,就获得了一个截取片段的PCM文件

计算文件头

因为在截取过程中没有进行任何音频格式的改变,所以除了data长度(音频数据的字节数)外,不需要重新计算文件头的其他数据。

文件头中,各个数据的计算方式如下:

位置 示例值 计算方式
$[1, 4]$ “RIFF” 固定值"RIFF"
$[5, 8]$ 文件大小 整个文件的大小(包括数据和头的总大小)
$[9, 12]$ “WAVE” 固定值"WAVE"
$[13, 16]$ “fmt " 固定值"fmt "(有一个空格)
$[17, 20]$ 16 上述信息的大小,固定值16
$[21, 22]$ 1 音频数据格式,PCM时为1
$[23, 24]$ 2 音频声道数量
$[25,28]$ 44100 音频采样率
$[29,32]$ 176400 ${SampleRate}\times{BitsPerSample}\times{Channels}\div {8}$
$[33,34]$ 4 ${BitsPerSample}\times{Channels}\mod {8}$
$[35,36]$ 16 当个采样的采样位数
$[37,40]$ “data” 固定值"data"
$[41, 44]$ 数据大小 文件内部的数据大小

裁剪流程

H C C e l l a i i d p p e [ r s 1 e t ] n e a d n r d t S o F D D C u i a a l r l t t i c e a a p e s s t F i i o i z z l e e e = = = = = = = = = = = = = = = = = = > > C N N D C l e e a l i w w t i p a p s s F i i t i z z o l e e e

备注:

  1. 使用比特率*时间分别计算起始和结束字节的位置