Flutter中如何获取播放音频的振幅?
解决Flutter播放音频时获取振幅(maxDecibel/minDecibel)的方案
你当前使用的audio_video_progress_bar、just_audio、audio_service、on_audio_query这些库都专注于播放控制、进度展示或媒体文件查询,确实没有提供实时音频振幅分析的能力。要获取播放中的音频maxDecibel和minDecibel,可以通过以下两种思路实现:
方法一:使用支持音频分析的播放库
替换或配合现有播放逻辑,使用带音频分析功能的库,比如flutter_sound:
- 添加依赖到
pubspec.yaml:
flutter_sound: ^9.2.13
- 初始化播放并监听音频振幅:
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
相关产品推荐
相关产品推荐

