1.简介
wav(Waveform Audio File Format)是微软公司开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范。WAV是最接近无损的音乐格式,所以文件大小相对也比较大。
项目中需要获取wav音频文件的音频时长,因为之前获取gif文件的帧间隔是通过解析gif文件格式获取的,所以这次自然而然就想到通过解析wav文件格式获取音频时长。
2.wav文件格式解析
学习自:http://soundfile.sapp.org/doc/WaveFormat/。
如图1所示,wav文件一般由3个区块组成,包括RIFF块、fmt块、data块。
2.1 RIFF区块
1.RIFF区块以“RIFF”为标识,见图2第一个红色框标识。
2.如图1所示RIFF包括ChunkID、ChunkSize、Format,具体的偏移地址、字节数及端序(大端或小端)见图1。
2.2 fmt区块
1.fmt区块以“fmt”为标识,见图2第二个红色框标识。
2.fmt区块包括ID、Size(该区块数据的长度)、AudioFormat(音频格式)、NumChannels(声道数)、SampleRate(采样率)、ByteRate(每秒数据字节数)、BlockAlign、BitsPerSample(采样位数)等,具体的偏移地址、字节数及端序(大端或小端)见图1。
2.3 data区块
1.data区块以“data”为标识,见图2第三个红色框标识。
2.data区块包括ID、Size(音频数据的长度)、data(音频数据)。
3.计算时长
data区块里面的size表示所有音频数据的长度,fmt区块里面的ByteRate表示每秒数据字节数。所以音频时长可以通过(size/ByteRate)得到。
4.代码
说明:用到的(28,31)、(40,43)是(偏移地址,偏移地址+字节数)。具体可在图1中查到。
6.参考
1.http://soundfile.sapp.org/doc/WaveFormat/
2.https://www.jianshu.com/p/947528f3dff8