【问题标题】:How to calculate amplitude from Uint8List Stream?如何从 Uint8List Stream 计算振幅?
【发布时间】:2022-07-11 16:10:25
【问题描述】:

我正在使用flutter_sound 包从麦克风录制音频。它在Uint8List 的流中提供数据。那么如何从中计算振幅。我找到了很多其他语言的答案,但我很难将其解释为dart

供参考,

Reading in a WAV file and calculating RMS

Detect silence when recording

how can i translate byte[] buffer to amplitude level

如果有人可以将其解释为飞镖,以便我可以计算振幅

【问题讨论】:

  • 您的音频是什么字节格式和编解码器?看起来您可以控制startRecorder 中的编解码器,例如codec: Codec.pcm16。选择 pcm16 或 float32,然后你得到的每一块字节,用ByteData.asXXX 解释为短裤或浮点数。然后根据需要执行您的 RMS。我建议使用 float32 只是因为这样你会得到介于 -1 和 +1 之间的数字,并且不需要自己规范化。
  • @RichardHeap 我有 pcm16 编解码器。正如你所说,我做了 data!.buffer.asByteData().getFloat32() 但 getFloat32() 需要 byteOffset 作为参数,所以我应该传递什么?
  • 第一个是 0,第二个是 4,然后是 8、12、16 等
  • 但使用api.flutter.dev/flutter/dart-typed_data/ByteBuffer/…将缓冲区转换为浮点列表可能更简单
  • 请注意,您也需要先将编解码器切换为float32

标签: flutter dart audio


【解决方案1】:

我无法从Uint8List 计算幅度,所以我所做的是编写自己的本机代码以直接从本机获取幅度,您可以查看我的包here。 (我在其他地方很忙,所以我现在不维护它,但以后肯定会这样做。)

我不知道,但flutter_sound 提供的值可能是错误的,或者我计算错误,但即使音量高或低,我总是得到几乎相同的值。

现在,如果你想计算幅度,那么它应该基于你得到的值,

如果您获得的值介于 -32768 和 32767 之间,那么根据我的理解,您所做的是定义一个时间范围,并针对该时间范围计算它的 RMS

RMS 是您的幅度。

现在,正如@richard 在评论中所说,如果您有Int16List,则使用 32768 进行标准化。但我想这是做太多的工作。我们得到一个 Int16List 流,因此数据可能每 200 毫秒或在插件级别设置的任何内容来。为每个 Int16List 计算 RMS 是一项非常繁重的任务,所以我认为在颤振方面这样做并不好。直接从原生获取数据,然后使用平台通道将其传递。

现在,如果您想尝试计算 Int16List 的 RMS,则在定义的时间范围内取这些值的平均值。

我很可能是错的,但希望这能帮助或引导您朝着正确的方向前进。如果有人找到更好的方法,请在此处发布。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    相关资源
    最近更新 更多