WAV简介:

  1. 标准格式化的 WAV 文件和 CD 格式一样,也是 44.1K 的取样频率, 16 位量化数字,因此在声音文件质量和 CD 相差无几。
  2. WAV 是由若干个Chunk 组成的。按照在文件中的出现位置包括:RIFF WAVE Chunk、Format Chunk、 Fact Chunk(可选)和 Data Chunk。 每个Chunk又由块标识符数据大小数据三部分组成:
    Waveform Audio实际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就可以播放音乐了~
      Waveform Audio

相关文章: