Flutter-解析wav音频文件,判断是否全程静默

527 阅读2分钟

前言

wav文件分为两个部分,第一个部分是wav头文件,第二个部分是PCM编码的音频数据部分。

wav的基础知识介绍

wav是微软开发的一种音频文件格式.
它符合它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,
被Windows平台及其应用程序所广泛支持。
标准化的wav文件都是44.1k的采样率,采用16位的数字表示。
但是我们的成了里面采样率是16k的,采用16为的数字表示。
wav文件分为两个部分,第一个部分是wav头文件,第二个部分是PCM编码的音频数据部分。

wav头文件数据结构

偏移地址大小字节数据块类型内容
00H~03H44字符资源交换文件标志(RIFF)
04H~07H4长整数从下个地址开始到文件尾的总字节数
08H~0BH44字符WAV文件标志(WAVE)
0CH~0FH44字符波形格式标志(fmt ),最后一位空格。
10H~13H4整数过滤字节(一般为00000010H)
14H~15H2整数格式种类(值为1时,表示数据为线性PCM编码)
16H~17H2整数通道数,单声道为1,双声道为2
18H~1BH4长整数采样频率
1CH~1FH4长整数波形数据传输速率(每秒平均字节数)
20H~21H2整数DATA数据块长度,字节。
22H~23H2整数PCM位宽
24H~27H44字符“fact”,该部分一下是可选部分,即可能有,可能没有,一般到WAV文件由某些软件转换而成时,包含这部分。
28H~2BH4长整数size,数值为4

所以一个wav文件的前44位是非音频的数据。而后面的所有内容即为PCM编码内容

PCM编码介绍

其中,数字信号是对连续变化的模拟信号进行抽样、量化和编码产生的,称为PCM(Pulse-code modulation),即脉冲编码调制。
声音的本质就是波,我们可以用cooledit打开音频文件,看到下图所示的内容 image.png 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;
}