文件解码 - wav
wav是微软与IBM开发的一种存储音频原始数据的格式。存储的数值是离散采样的音频振幅
由ADC将模拟信号转换成数字信号后,每隔一定时间(间隔由采样率决定)量化的数值。
样本大小 | 数据格式 | 最小值 | 最大值 |
---|
8位PCM | unsigned int | 0 | 225 |
16位PCM | int | -32767 | 32768 |
文件整体结构
主要分成3块,如果是其他文件转码来的,可能存在fact块,在fmt块的BlockAlign指示了是否存在fact块
Riff块
名称 | 长度 | 内容 |
---|
ID | 4 | “RIFF” |
Size | 4 | 不含ID和Size的共8个字节,下同 |
Type | 4 | “WAVE” |
struct Riff{
unsigned char RiffID[4];
unsigned char RiffSize[4];
unsigned char RiffType[4];
};
Format块
名称 | 长度 | 内容 |
---|
ID | 4 | “fmt” |
Size | 4 | 16|18 18则跟有附加的2字节 |
FormatTag | 2 | 编码方式,一般0x0001 |
Channels | 2 | 声道数,1-mono单声道 2-stereo双声道 |
SamplesPerSec | 4 | 采样频率 |
AvgBytesPerSec | 4 | 码率 |
BlockAlign | 2 | 每个采样包含的字节数 |
BitsPerSample | 2 | 每个采样需要的比特数 |
(附加可选) | 2 | 附加信息,由Size决定有无 |
编码方式及fmt长度 fact块是否存在
格式代码 | 格式名称 | fmt 块长度 | fact 块 |
---|
1(0x0001) | PCM/非压缩格式 | 16 | |
2(0x0002) | Microsoft ADPCM | 18 | √ |
3(0x0003) | IEEE float | 18 | √ |
6(0x0006) | ITU G.711 a-law | 18 | √ |
7(0x0007) | ITU G.711 μ-law | 18 | √ |
49(0x0031) | GSM 6.10 | 20 | √ |
64(0x0040) | ITU G.721 ADPCM | | √ |
65,534(0xFFFE) | 见子格式块中的编码格式 | 40 | |
fmt扩展表
偏移 | 长度 | 数据类型 | 字段名称 | 字段说明 |
---|
24H | 2 | 整型数 | 扩展区长度 | 22 |
26H | 2 | 整型数 | 有效采样位数 | 最大值为每个采样字节数*8 |
28H | 4 | 长整形数 | 扬声器位置 | 声道号与扬声器位置映射的二进制掩码 |
32H | 2 | 整型数 | 编码格式 | 真正的编码格式代码 |
34H | 14 | | | |
struct Format{
unsigned char FormatID[4];
unsigned char FormatSize[4];
unsigned char FormatTag[2];
unsigned char FormatChannells[2];
unsigned char FormatSamplesPerSec[4];
unsigned char FormatAvgBytesPerSec[4];
unsigned char FormatBolckAlign[2];
unsigned char FormatBitsPerSample[2];
unsigned char FormatAttach[2];
};
Fact块
该块是可选的,对于压缩编码格式要包含这个块
名称 | 长度 | 内容 |
---|
ID | 4 | “fact” |
Size | 4 | 4 |
data | 4 | 采样总数 (每个声道) |
struct Fact{
unsigned char FactID[4];
unsigned char FactSize[4];
unsigned char FactData[4];
};
Data块
真正存储PCM数据的块
位深 | 单声道排列 | 双声道排列 |
---|
8bit | 声道0|声道0|声道0 | 声道0|… | 声道0|声道1|声道0 | 声道1|… |
16bit | 声道0低字节| 声道0高字节 |声道0低字节 |声道0高字节 | 声道0低字节| 声道0高字节 |声道1低字节 |声道1高字节 |