Audio Waveforms - Simform LLC.

音频波形

使用此插件可以在任何支持的编码器或音频文件的格式中录制音频时生成波形。我们可以使用手势来滚动波形,或在播放音频时跳转到任何位置,还可以自定义波形样式。

预览

录像机

平台特定配置

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>This app is requires Mic permission.</string>

此插件需要 iOS 10.0 或更高版本。因此,请在 Podfile 中添加此行

platform :ios, '10.0'

安装

  1. 将依赖项添加到 pubspec.yaml

dependencies:
    audio_waveforms: <latest-version>

在 pub.dev 的“安装”选项卡中获取最新版本: pub.dev

  1. 导入包。
import 'package:audio_waveforms/audio_waveforms.dart';

用法

  1. 初始化 RecorderController

late final RecorderController recorderController;
@override
void initState() {
  super.initState();
  recorderController = RecorderController();
}
  1. 在 widget 树中使用 AudioWaveforms widget

AudioWaveforms(
  size: Size(MediaQuery.of(context).size.width, 200.0),
  recorderController: recorderController,
),
  1. 开始录音(它还将显示波形)
await recorderController.record();

您可以在 record 函数的 path 参数中提供带扩展名的文件名和完整路径。如果未提供,则默认为 .aac 扩展名,并以日期时间作为文件名。

  1. 暂停录音
await recorderController.pause();
  1. 停止录音
final path = await recorderController.stop();

调用此函数将录音保存在提供的路径中,它将返回该文件的路径。

  1. 释放 RecorderController

@override
void dispose() {
 recorderController.dispose();
 super.dispose();
}

附加功能

  1. 滚动波形

AudioWaveforms(
 enableGesture: true,
),

通过启用手势,您可以在录音状态或暂停状态下滚动波形。

  1. 刷新波形到滚动后的初始位置
recorderController.refresh();

滚动后,波形将停止更新新添加的波形,因此我们可以使用此功能使波形再次更新。它也可以在暂停/停止状态下使用。

  1. 更改波形样式

AudioWaveforms(
 waveStyle: WaveStyle(
   color: Colors.white,
   showDurationLabel: true,
   spacing: 8.0,
   showBottom: false,
   extendWaveform: true,
   showMiddleLine: false,
 ),
),
  1. 为波形应用渐变

AudioWaveforms(
  waveStyle: WaveStyle(
   gradient: ui.Gradient.linear(
    const Offset(70, 50),
    Offset(MediaQuery.of(context).size.width / 2, 0),
    [Colors.red, Colors.green],
   ),
  ),
),
  1. 显示波形时长

AudioWaveforms(
 waveStyle: WaveStyle(showDurationLabel: true),
),
  1. 更改波形更新频率并根据需要和平台进行标准化

late final RecorderController recorderController;
  @override
  void initState() {
    super.initState();
    recorderController = RecorderController()
      ..updateFrequency = const Duration(milliseconds: 100)
      ..normalizationFactor = Platform.isAndroid ? 60 : 40;
  }
  1. 使用不同类型的编码器和采样率

late final RecorderController recorderController;
  @override
  void initState() {
    super.initState();
    recorderController = RecorderController()
      ..androidEncoder = AndroidEncoder.aac
      ..androidOutputFormat = AndroidOutputFormat.mpeg4
      ..iosEncoder = IosEncoder.kAudioFormatMPEG4AAC
      ..sampleRate = 16000;
  }
  1. 监听滚动时长位置
recorderController.currentScrolledDuration.addListener((duration){});

要使用此功能,需要启用 shouldCalculateScrolledPosition 标志。时长以毫秒为单位。

播放器

用法

  1. 初始化 PlayerController

late PlayerController playerController;
@override
void initState() {
  super.initState();
  playerController = PlayerController();
}
  1. 准备播放器
await playerController.preparePlayer(path);

在参数中提供音频文件路径。您还可以使用可选参数设置音量。

  1. 在 widget 树中使用 widget

AudioFileWaveforms(
 size: Size(MediaQuery.of(context).size.width, 100.0),
 playerController: playerController,
)
  1. 开始播放
await playerController.startPlayer();

默认情况下,音频结束后会跳回开头,但您可以传递 false 让它停留在末尾。

  1. 暂停播放
await playerController.pausePlayer();
  1. 停止播放
await playerController.stopPlayer();
  1. 释放 playerController

@override
void dispose() {
 playerController.dispose();
 super.dispose();
}

附加功能

  1. 为播放器设置音量
await playerController.setVolume(1.0);
  1. 跳转到任何位置
await playerController.seekTo(5000);
  1. 获取音频文件的当前/最大时长
final duration = await playerController.getDuration(DurationType.max);
  1. 使用手势跳转

AudioFileWaveforms(
 enableSeekGesture: true,
)

音频也可以通过在波形上手势进行跳转(默认启用)。 5. 以不同模式结束音频

await playerController.startPlayer(finishMode: FinishMode.stop);

使用 FinishMode.stop 将停止播放器,FinishMode.pause 将暂停播放器,FinishMode.loop 将循环播放器。

  1. 监听播放器状态更改
playerController.onPlayerStateChanged.listen((state) {});
  1. 监听当前时长
playerController.onCurrentDurationChanged.listen((duration) {});

时长以毫秒为单位。

GitHub

查看 Github