前言
wav文件分为两个部分,第一个部分是wav头文件,第二个部分是PCM编码的音频数据部分。
wav的基础知识介绍
wav是微软开发的一种音频文件格式.
它符合它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,
被Windows平台及其应用程序所广泛支持。
标准化的wav文件都是44.1k的采样率,采用16位的数字表示。
但是我们的成了里面采样率是16k的,采用16为的数字表示。
wav文件分为两个部分,第一个部分是wav头文件,第二个部分是PCM编码的音频数据部分。
wav头文件数据结构
| 偏移地址 | 大小字节 | 数据块类型 | 内容 |
|---|---|---|---|
| 00H~03H | 4 | 4字符 | 资源交换文件标志(RIFF) |
| 04H~07H | 4 | 长整数 | 从下个地址开始到文件尾的总字节数 |
| 08H~0BH | 4 | 4字符 | WAV文件标志(WAVE) |
| 0CH~0FH | 4 | 4字符 | 波形格式标志(fmt ),最后一位空格。 |
| 10H~13H | 4 | 整数 | 过滤字节(一般为00000010H) |
| 14H~15H | 2 | 整数 | 格式种类(值为1时,表示数据为线性PCM编码) |
| 16H~17H | 2 | 整数 | 通道数,单声道为1,双声道为2 |
| 18H~1BH | 4 | 长整数 | 采样频率 |
| 1CH~1FH | 4 | 长整数 | 波形数据传输速率(每秒平均字节数) |
| 20H~21H | 2 | 整数 | DATA数据块长度,字节。 |
| 22H~23H | 2 | 整数 | PCM位宽 |
| 24H~27H | 4 | 4字符 | “fact”,该部分一下是可选部分,即可能有,可能没有,一般到WAV文件由某些软件转换而成时,包含这部分。 |
| 28H~2BH | 4 | 长整数 | size,数值为4 |
所以一个wav文件的前44位是非音频的数据。而后面的所有内容即为PCM编码内容
PCM编码介绍
其中,数字信号是对连续变化的模拟信号进行抽样、量化和编码产生的,称为PCM(Pulse-code modulation),即脉冲编码调制。
声音的本质就是波,我们可以用cooledit打开音频文件,看到下图所示的内容
PCM实际上就是讲这个波形图通过按一定的时间间隔,收集起来。
所以我们要判断wav音频文件是否全程静默,就是判断PCM的没有波,即每个字节的数据为0。
///wav文件是否全程静默
Future<bool?> isSilence(String path) async {
File file = File(path);
if (file.existsSync()) {
Uint8List list = file.readAsBytesSync();
int length = list.length;
//前44位非pcm数据,不取。
if (length <= 44) {
return null;
}
List<int> i = [];
//求和pcm的值
i.addAll(list.getRange(44, list.length));
//返回判断结果
return i.sum() == 0;
}
return null;
}