将音频流/ Uint8List数据保存在文件抖动中

时间:2020-04-28 14:20:05

标签: android flutter dart buffer audio-recording

我从Android和iOS的录音机插件中获得Uint8List。每当我从麦克风的流订阅中获取数据时,我都希望将数据写入本地可播放的音频文件中。有没有可能写数据的方法?

目前,我正在存储类似的数据

recordedFile.writeAsBytesSync(recordedData, flush: true);

它正在将数据写入文件,但无法从文件存储中播放。但是,如果我读取了相同的文件,并给它提供了要插入的字节数,则它正在播放相同的缓冲区。

1 个答案:

答案 0 :(得分:3)

在将字节写入文件之前,我已经添加了WAVE / RIFF标头,从而将元数据提供给字节和文件。

我的流中有16个BIT PCM音频字节,带有MONO通道。接收字节时,我会将这些字节追加到字节列表中。

List<int> recordedData = [];
recordedData.addAll(value);

现在,我所有的记录字节都在列表中。 停止录音机后,我调用了以下功能。它将所有数据和采样率记录下来。在我的情况下是44100。

await save(recordedData, 44100);

Future<void> save(List<int> data, int sampleRate) async {
    File recordedFile = File("/storage/emulated/0/recordedFile.wav");

    var channels = 1;

    int byteRate = ((16 * sampleRate * channels) / 8).round();

    var size = data.length;

    var fileSize = size + 36;

    Uint8List header = Uint8List.fromList([
      // "RIFF"
      82, 73, 70, 70,
      fileSize & 0xff,
      (fileSize >> 8) & 0xff,
      (fileSize >> 16) & 0xff,
      (fileSize >> 24) & 0xff,
      // WAVE
      87, 65, 86, 69,
      // fmt
      102, 109, 116, 32,
      // fmt chunk size 16
      16, 0, 0, 0,
      // Type of format
      1, 0,
      // One channel
      channels, 0,
      // Sample rate
      sampleRate & 0xff,
      (sampleRate >> 8) & 0xff,
      (sampleRate >> 16) & 0xff,
      (sampleRate >> 24) & 0xff,
      // Byte rate
      byteRate & 0xff,
      (byteRate >> 8) & 0xff,
      (byteRate >> 16) & 0xff,
      (byteRate >> 24) & 0xff,
      // Uhm
      ((16 * channels) / 8).round(), 0,
      // bitsize
      16, 0,
      // "data"
      100, 97, 116, 97,
      size & 0xff,
      (size >> 8) & 0xff,
      (size >> 16) & 0xff,
      (size >> 24) & 0xff,
      ...data
    ]);
    return recordedFile.writeAsBytesSync(header, flush: true);
  }

它正在创建可播放的WAV文件。