音频波形
使用此插件可以在录制任何编码器支持的文件格式的音频时生成波形,或从音频文件中生成波形。我们可以使用手势滚动波形或在播放音频时跳转到任何位置,还可以自定义波形样式。
预览
查看迁移指南以从0.1.5+1迁移到1.0.0
录音机
平台特定配置
Android
在你的android/app/build.gradle
文件中将最低Android sdk版本改为21(或更高)。
minSdkVersion 21
在AndroidManifest.xml
中添加RECORD_AUDIO权限
<uses-permission android:name="android.permission.RECORD_AUDIO" />
iOS
在ios/Runner/Info.plist
中添加这两行
<key>NSMicrophoneUsageDescription</key>
<string>此应用需要麦克风权限。</string>
此插件需要ios 10.0或更高版本。所以在Podfile
中添加这一行
platform :ios, '12.0'
安装
- 在
pubspec.yaml
中添加依赖
dependencies:
audio_waveforms: <最新版本>
在pub.dev的'Installing'标签中获取最新版本
- 导入包。
import 'package:audio_waveforms/audio_waveforms.dart';
使用方法
- 录制音频
RecorderController controller = RecorderController(); // 初始化
await controller.record(path: 'path'); // 录制(路径可选)
final hasPermission = await controller.checkPermission(); // 检查麦克风权限(在录制时也会调用)
await controller.pause(); // 暂停录制
final path = await controller.stop(); // 停止录制并获取路径
controller.refresh(); // 刷新波形至原始位置
controller.dispose(); // 释放控制器
- 在组件树中使用
AudioWaveforms
组件
AudioWaveforms(
size: Size(MediaQuery.of(context).size.width, 200.0),
recorderController: controller,
enableGesture: true,
waveStyle: WaveStyle(
...
color: Colors.white,
showDurationLabel: true,
spacing: 8.0,
showBottom: false,
extendWaveform: true,
showMiddleLine: false,
gradient: ui.Gradient.linear(
const Offset(70, 50),
Offset(MediaQuery.of(context).size.width / 2, 0),
[Colors.red, Colors.green],
),
...
),
),
高级用法
controller.updateFrequency = const Duration(milliseconds: 100); // 更新新波形的速度
controller.androidEncoder = AndroidEncoder.aac; // 更改Android编码器
controller.androidOutputFormat = AndroidOutputFormat.mpeg4; // 更改Android输出格式
controller.iosEncoder = IosEncoder.kAudioFormatMPEG4AAC; // 更改iOS编码器
controller.sampleRate = 44100; // 更新采样率
controller.bitRate = null; // 更新比特率
controller.onRecorderStateChanged.listen((state){}); // 监听录音机状态变化
controller.onCurrentDuration.listen((duration){}); // 监听当前持续时间更新
controller.onRecordingEnded.listen((duration)); // 监听音频文件持续时间
controller.recordedDuration; // 获取已录制的音频时长
controller.elapsedDuration; // 获取当前已录制的音频时长
controller.currentScrolledDuration; // 当前滚动位置的时长通知器
controller.overrideAudioSession = true // 是否使用默认AudioSession配置
播放器
使用方法
PlayerController controller = PlayerController(); // 初始化
// 提取波形数据
final waveformData = await controller.extractWaveformData(
path: 'path',
noOfSamples: 100,
);
// 或直接从preparePlayer中提取并初始化音频播放器
await controller.preparePlayer(
path: 'path',
shouldExtractWaveform: true,
noOfSamples: 100,
volume: 1.0,
);
await controller.startPlayer(finishMode: FinishMode.stop); // 开始音频播放
await controller.pausePlayer(); // 暂停音频播放
await controller.stopPlayer(); // 停止音频播放
await controller.setVolume(1.0); // 设置音量级别
await controller.seekTo(5000); // 跳转音频
await controller.setRate(1.0); // 更新音频播放速度
final duration = await controller.getDuration(DurationType.max); // 获取音频播放器的时长
controller.updateFrequency = UpdateFrequency.low; // 更新当前时长的报告速率
controller.onPlayerStateChanged.listen((state) {}); // 监听播放器状态变化
controller.onCurrentDurationChanged.listen((duration) {}); // 监听当前时长变化
controller.onCurrentExtractedWaveformData.listen((data) {}); // 监听最新提取的数据
controller.onExtractionProgress.listen((progress) {}); // 监听提取进度
controller.onCompletion.listen((_){}); // 监听音频完成
controller.stopAllPlayer(); // 停止所有注册的音频播放器
controller.dispose(); // 释放控制器
在组件树中使用AudioFileWaveforms
组件
AudioFileWaveforms(
size: Size(MediaQuery.of(context).size.width, 100.0),
playerController: controller,
enableSeekGesture: true,
waveformType: WaveformType.long,
waveformData: [],
playerWaveStyle: const PlayerWaveStyle(
fixedWaveColor: Colors.white54,
liveWaveColor: Colors.blueAccent,
spacing: 6,
...
),
...
);