如何在Flutter应用中实现0-10000Hz音频自定义频率播放?
在Flutter中播放指定频率的音频
方案一:使用专用音调生成库(快速实现)
推荐用flutter_tones库,它封装了多种波形的音调生成逻辑,无需手动处理底层音频数据。
- 添加依赖到
pubspec.yaml:
dependencies: flutter_tones: ^1.0.0
- 调用播放方法:
import 'package:flutter_tones/flutter_tones.dart'; // 播放用户指定频率的音调,支持自定义参数 void playTargetTone(double frequency) async { await FlutterTones.playTone( frequency: frequency, // 用户设置的Hz值 duration: Duration(seconds: 2), // 按需调整播放时长 waveform: Waveform.sine, // 可选波形:sine/square/triangle/sawtooth volume: 0.6, // 音量范围0-1 ); }
方案二:手动生成PCM音频数据(高度自定义)
如果需要更灵活的波形控制,可手动生成PCM采样数据,再通过音频播放器播放。这里以flutter_sound为例:
- 添加依赖:
dependencies: flutter_sound: ^9.2.13
- 实现生成与播放逻辑:
import 'package:flutter_sound/flutter_sound.dart'; import 'dart:typed_data'; import 'dart:math'; final FlutterSoundPlayer _audioPlayer = FlutterSoundPlayer(); Future<void> playCustomFrequencyTone(double targetHz) async { const int sampleRate = 44100; // 标准音频采样率 const int playDuration = 2; // 播放时长(秒) final int totalSamples = sampleRate * playDuration; const int maxAmplitude = 32767; // 16位PCM的最大振幅值 // 生成正弦波采样数据(可替换为方波、三角波算法) final List<int> pcmSamples = []; for (int i = 0; i < totalSamples; i++) { double time = i / sampleRate; double waveValue = sin(2 * pi * targetHz * time); int intValue = (waveValue * maxAmplitude).toInt(); // 将16位整数转换为小端字节 pcmSamples.add(intValue & 0xFF); pcmSamples.add((intValue >> 8) & 0xFF); } // 初始化播放器并播放 await _audioPlayer.openPlayer(); await _audioPlayer.startPlayerFromBuffer( Uint8List.fromList(pcmSamples), sampleRate: sampleRate, numChannels: 1, format: Codec.pcm16, ); } // 页面销毁时释放播放器资源 void disposeAudioPlayer() async { await _audioPlayer.closePlayer(); }
注意事项
- 权限配置:iOS需在
Info.plist中添加NSMicrophoneUsageDescription;Android需在AndroidManifest.xml添加<uses-permission android:name="android.permission.RECORD_AUDIO" />和<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />。 - 播放中断:需处理来电、系统通知等导致的播放暂停,可通过播放器的回调监听状态变化。
- 波形扩展:如果需要方波、三角波,只需修改采样数据的生成算法,比如方波可通过判断
waveValue的正负直接返回±maxAmplitude。
内容的提问来源于stack exchange,提问作者Parth Soneji
相关产品推荐
相关产品推荐

