我需要制作一个通过图形化音频数据来可视化的应用程序,并且我已经尝试过扑动声 https://pub.dev/packages/flutter_sound and 音流 http://47.240.41.80/packages/sound_stream获取原始音频数据。然而,这两个库都将声音捕获为 16 位 pcm,但返回 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);
}
}
It's a Uint8List
因为这是一个字节数组,并且是跨原生 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 个样本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)