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

如何在Flutter应用中实现0-10000Hz音频自定义频率播放?

在Flutter中播放指定频率的音频

方案一:使用专用音调生成库(快速实现)

推荐用flutter_tones库,它封装了多种波形的音调生成逻辑,无需手动处理底层音频数据。

  1. 添加依赖到pubspec.yaml:
dependencies:
  flutter_tones: ^1.0.0
  1. 调用播放方法:
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为例:

  1. 添加依赖:
dependencies:
  flutter_sound: ^9.2.13
  1. 实现生成与播放逻辑:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:57:18