颤音流如何表示 pcm 数据?

How is flutter sound stream representing pcm data?

我需要制作一个应用程序,通过图形将音频数据可视化,我已经尝试 fluter sound and sound stream 获取原始音频数据。然而,这两个库都将声音捕获为 16 位 pcm,但 returns Uint8list 流。所以我不明白他们如何用 8 位整数表示 16 位 pcm。

我试过按原样画出数字,但它似乎不正确。以下是我用来绘制 30hz 正弦波的代码,数据 sound_stream 提供。

final Uint8List data; 
  @override
  void paint(Canvas canvas, Size size) { 
    double dx = size.width / data.length;
    for(int i = 1; i < data.length; i+=1){
    canvas.drawLine(Offset((i - 1) * dx, (data[i-1].toDouble()/256) * size.height), Offset((i) * dx, (data[i].toDouble()/256) * size.height),  Paint()..color = Colors.red..strokeWidth=1);
    }
  }

它是一个 Uint8List,因为它是一个字节数组,并且是越过 native-Dart 边界的内容。因此,您需要将该字节数组视为 16 位整数的列表。使用 ByteBuffer 来执行此操作。

final Uint8List data;
final pcm16 = data.buffer.asInt16List();
// pcm16 is an Int16List and will be half the length of data
// expect values in pcm16 to be between -32768 and +32767 so
// normalize by dividing by 32768.0 to get -1.0 to +1.0

您可能会发现您获得的字节数是预期的两倍。如果您以 16kHz 采样,预计每秒 32k 字节,但当以 16 位整数查看时,您将每秒获得 16000 个样本。