You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中使用noise_meter包控制每秒仅获取少量分贝读数

解决方案:降低noise_meter的读数频率

嘿,这个问题我碰到过类似的,给你两个实用的解决思路:

1. 从配置层面调整采样参数(推荐)

你提到的每秒120次读数,本质是因为noise_meter默认的音频采样缓冲块太小,导致回调触发过于频繁。它的读数频率和采样率(sampleRate)、**缓冲块大小(bufferSize)**直接相关,计算公式很直观:

每秒回调次数 = 采样率 / 缓冲块大小

既然包的默认采样率是40100,那如果要实现每秒1次读数,就把缓冲块大小设为40100;要每秒2次的话,设为20050(40100÷2)就行。

修改示例代码的初始化部分,比如:

// 初始化NoiseMeter时指定缓冲块大小
final noiseMeter = NoiseMeter(
  sampleRate: 40100, // 保持包默认的采样率
  bufferSize: 40100, // 每秒触发1次回调
);

noiseMeter.listen((noiseReading) {
  // 这里只会每秒收到1次分贝读数
  print("当前分贝:${noiseReading.decibel}");
});

注意:部分平台对缓冲块大小有上限要求,如果40100太大导致报错,可以尝试用接近的2的幂数(比如32768),这样每秒读数次数会接近1次(40100÷32768≈1.22次/秒),也能满足你的需求。

2. 在业务代码中做节流过滤(简单直接)

如果修改采样参数遇到限制(比如包不支持自定义bufferSize),可以在自己的代码里加一个时间过滤逻辑,只保留每隔1秒/0.5秒的读数:

DateTime? lastRecordTime;
// 控制频率:Duration(seconds:1)是1次/秒,Duration(milliseconds:500)是2次/秒
const recordInterval = Duration(seconds: 1);

NoiseMeter().listen((noiseReading) {
  final now = DateTime.now();
  // 判断距离上次记录是否超过设定间隔
  if (lastRecordTime == null || now.difference(lastRecordTime!) >= recordInterval) {
    // 只处理符合频率要求的读数
    print("当前分贝:${noiseReading.decibel}");
    lastRecordTime = now;
  }
});

这种方法不需要修改包的配置,直接在回调里做过滤,兼容性更好,上手也快。

小提示

建议先尝试第一种方案,因为从源头减少采样次数能节省一点性能;如果第一种不行,第二种方案肯定能解决问题。你可以根据自己的实际情况选择~

内容的提问来源于stack exchange,提问作者yellesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:28:12