WAV简介:
- 标准格式化的 WAV 文件和 CD 格式一样,也是 44.1K 的取样频率, 16 位量化数字,因此在声音文件质量和 CD 相差无几。
- WAV 是由若干个Chunk 组成的。按照在文件中的出现位置包括:RIFF WAVE Chunk、Format Chunk、 Fact Chunk(可选)和 Data Chunk。 每个Chunk又由块标识符、数据大小和数据三部分组成:
实际Chunk的大小为数据大小加8个字节。
- RIFF WAVE Chunk:该块以“RIFF” 作为标示,紧跟 wav文件大小(该大小是 wav 文件的总大小-8字节,也就是一个u32的大小),然后数据段为“WAVE”,表示是 wav 文件。 RIFF块的 Chunk 结构如下:
typedef __packed struct { u32 ChunkID; //chunk id;这里固定为"RIFF",即 0x52494646,R[52] I[49] F[46] u32 ChunkSize ; //集合大小,文件总大小-8字节,02131C02表示音乐文件一共有35394306字节大小 u32 Format; //格式:WAVE,即 0x57415645 }ChunkRIFF;
- Format Chunk:该块以“fmt ”作为标示(注意t后面有个空格),一般情况下,该段的大小为 16 个字节,但是有些软件生成的 wav 格式,该部分可能有 18 个字节,含有 2 个字节的附加信息。 Format 块的 Chunk 结构如下:
typedef __packed struct { u32 ChunkID; //chunk id;这里固定为"fmt ",即 0x666D7420 ,空格[20] u32 ChunkSize ; //子集合大小(不包括 ID 和 Size),就是这个chunk后面的字节数 u16 AudioFormat; //音频格式:1表示线性 PCM;2表示IMA ADPCM u16 NumOfChannels; //通道数量;1,表示单声道;2,表示双声道 u32 SampleRate; //采样率:44AC0000表示44100Hz(以字节为单位反着的,后面都是) u32 ByteRate; //字节速率:10B10200表示176400 u16 BlockAlign; //块对齐(字节):0400表示4字节对齐 u16 BitsPerSample; //单个采样数据大小:1000表示单个数据16位 }ChunkFMT;
- Fact Chunk:该块为可选块,以“fact”作为标示,不是
每个 WAV 文件都有, 在非 PCM 格式的文件中, 一般会在 Format 结构后面加入一个 Fact 块,该块 Chunk 结构如下:
typedef __packed struct { u32 ChunkID; //chunk id;这里固定为"fact",即 0X74636166; u32 ChunkSize ; //子集合大小(不包括 ID 和 Size) u32 DataFactSize; //数据转换为 PCM 格式后的大小 }ChunkFACT;
DataFactSize 是这个 Chunk 中最重要的数据,如果这是某种压缩格式的声音文件,那么从这里就可以知道他解压缩后的大小。对于解压时的计算会有很大的好处! 但如果使用的是 PCM 格式,就不存在这个块。 - Data Chunk:该块是真正保存 wav 数据的地方,以“data”作为该 Chunk 的标示, 然后是数据的大小。数据块的 Chunk 结构如下:
typedef __packed struct { u32 ChunkID; //chunk id;这里固定为"data",即 0x64617461 u32 ChunkSize ; //子集合大小(不包括 ID 和 Size);文件大小-60. }ChunkDATA;
ChunkSize 后紧接着就是 wav 数据了,得到wav数据之后,通过I2S把数据传输给WM8978就可以播放音乐了~