如何在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
相关产品推荐
相关产品推荐

