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

Flutter中如何获取播放音频的振幅?

解决Flutter播放音频时获取振幅(maxDecibel/minDecibel)的方案

你当前使用的audio_video_progress_bar、just_audio、audio_service、on_audio_query这些库都专注于播放控制、进度展示或媒体文件查询,确实没有提供实时音频振幅分析的能力。要获取播放中的音频maxDecibel和minDecibel,可以通过以下两种思路实现:

方法一:使用支持音频分析的播放库

替换或配合现有播放逻辑,使用带音频分析功能的库,比如flutter_sound:

  1. 添加依赖到pubspec.yaml:
flutter_sound: ^9.2.13
  1. 初始化播放并监听音频振幅:
import 'package:flutter_sound/flutter_sound.dart';

FlutterSoundPlayer? _player;
StreamSubscription? _dbSubscription;
double? _maxDecibel;
double? _minDecibel;

void initPlayer() async {
  _player = FlutterSoundPlayer();
  await _player!.openAudioSession();
  
  // 监听音频分贝数据,实时维护最大/最小分贝
  _dbSubscription = _player!.onProgress.listen((disposition) {
    if (disposition.decibels != null) {
      final currentDb = disposition.decibels!;
      _maxDecibel = _maxDecibel == null ? currentDb : max(_maxDecibel!, currentDb);
      _minDecibel = _minDecibel == null ? currentDb : min(_minDecibel!, currentDb);
    }
  });
  
  // 开始播放指定音频
  await _player!.startPlayer(
    fromURI: 'your_audio_file_path_or_url',
  );
}

// 页面销毁时释放资源
void disposePlayer() async {
  await _dbSubscription?.cancel();
  await _player?.closeAudioSession();
  _player = null;
}

flutter_sound的onProgress流会返回包含实时分贝值的PlaybackDisposition对象,你可以在监听过程中直接对比更新maxDecibel和minDecibel。

方法二:原生平台集成(自定义Method Channel)

如果不想替换现有播放库,也可以通过Flutter Method Channel调用原生平台API获取振幅数据:

Android端

利用Android的Visualizer类捕获当前播放音频的波形数据,将原始采样值转换为分贝值后通过Method Channel传递给Flutter,可与just_audio等库兼容。

iOS端

使用AVFoundation的AVAudioSession结合音频计量功能,获取播放音频的分贝数据,再通过Method Channel同步到Flutter层。

这种方式需要编写少量原生代码,但能保留你现有播放逻辑的完整性。

注意事项

  • 分贝值通常以dBFS(全刻度分贝)为单位,不同平台返回的原始数据可能需要进行转换计算。
  • 实时音频分析会消耗一定系统资源,无需监听时请及时停止相关逻辑,避免不必要的性能损耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:22:09