Flutter音频处理插件coast_audio_miniaudio的使用

Flutter音频处理插件coast_audio_miniaudio的使用

coast_audio_miniaudio 是一个基于 miniaudio 的扩展包。您可以使用此插件在Android、iOS和macOS上实现音频捕获、播放及其他多种音频功能。

功能特性

  • 音频捕获与播放

    • 支持 <code>Core Audio(iOS/macOS)</code><code>OpenSL ES(Android)</code><code>AAudio(Android)</code>
  • 设备枚举

  • PCM格式转换

  • 过滤器

    • 支持高通滤波器(HPF)、低通滤波器(LPF)、高架滤波器(HSF)、低架滤波器(LSF)和峰值均衡滤波器(PeakingEQ)
  • 解码

    • 支持 MP3、FLAC 和 WAV 格式
  • 编码

    • 支持 WAV 格式

安装配置

此插件通过 ffi 调用本地函数。为此,您必须将 <code>mabridge</code> 库链接到您的应用中。

预构建二进制文件位于 <code>https://github.com/SKKbySSK/coast_audio/tree/main/packages/coast_audio_miniaudio/mabridge/prebuilt</code>

如果您是Flutter用户,可以使用 <code>flutter_coast_audio_miniaudio</code> 包,它会自动处理这一设置步骤。

MabDevice

<code>MabDevice</code> 是一个抽象类,用于通过 <code>ma_device</code><code>ma_context</code> API 与音频设备交互。对于捕获,使用 <code>MabCaptureDevice</code>;对于播放,使用 <code>MabPlaybackDevice</code>

如果未指定 <code>device</code> 参数,则将使用默认音频设备。

以下示例展示了如何播放循环音频10秒:

MabDeviceContext.enableSharedInstance(
    backends: [
        MabBackend.coreAudio, // 使用 Core Audio 后端 (iOS/macOS)
        MabBackend.aaudio, // 使用 AAudio 后端 (Android)
    ],
);

const format = AudioFormat(sampleRate: 48000, channels: 2);

final captureDevice = MabCaptureDevice(
    context: MabDeviceContext.sharedInstance, // 在所有 MabDevice 实例中应使用相同的设备上下文
    format: format,
    bufferFrameSize: 2048, // bufferFrameSize 将用于存储捕获的数据。对于低延迟场景,设置为较小的值。
);

final playbackDevice = MabPlaybackDevice(
    context: MabDeviceContext.sharedInstance,
    format: format,
    bufferFrameSize: 2048,
);

// 初始化节点
final captureNode = MabCaptureDeviceNode(device: captureDevice);
final playbackNode = MabPlaybackDeviceNode(device: playbackDevice);
final graphNode = GraphNode();

// 连接节点
graphNode.connect(captureNode.outputBus, playbackNode.inputBus);
graphNode.connectEndpoint(playbackNode.outputBus);

// 开始输入和输出设备
captureDevice.start();
playbackDevice.start();

final task = AudioTask(
    clock: AudioIntervalClock(const Duration(milliseconds: 16)),
    format: format,
    framesRead: 2048,
    endpoint: graphNode.outputBus,
);

// 定期读取音频数据
task.start();

// 等待10秒
await Future<void>.delayed(const Duration(seconds: 10));

// 释放所有资源
task.dispose();
captureDevice.dispose();
playbackDevice.dispose();

MabAudioDecoder

<code>MabAudioDecoder</code> 是一个解码器类,用于通过 <code>ma_decoder</code> API 解码MP3、FLAC和WAV文件中的数据。此类实现了 <code>AudioDecoder</code> 抽象类,因此可以在 <code>DecoderNode</code> 上使用。

final dataSource = AudioFileDataSource(file: File('example.mp3'), mode: FileMode.read);
final decoder = MabAudioDecoder(
  dataSource: dataSource,
  outputFormat: _player.format,
);
final decoderNode = DecoderNode(decoder: decoder);

// 做一些操作...

decoderNode.dispose();
decoder.dispose();
dataSource.dispose();

过滤器

此插件支持以下过滤器:

  • 低通/高通滤波器
  • 低架/高架滤波器
  • 峰值均衡滤波器

可以通过传递上述过滤器来初始化 <code>MabFilterNode</code> 实例:

final node = MabFilterNode(
  format: format,
  filter: MabPeakingEQFilter(format: format, gainDb: 5, q: 1, frequency: 1000),
);

更多关于Flutter音频处理插件coast_audio_miniaudio的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音频处理插件coast_audio_miniaudio的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


coast_audio_miniaudio 是一个基于 miniAudio 的 Flutter 插件,用于处理音频数据。它提供了多种功能,包括音频播放、录制、音频格式转换、音频数据流处理等。以下是如何使用 coast_audio_miniaudio 插件的基本指南。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 coast_audio_miniaudio 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  coast_audio_miniaudio: ^0.1.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

2. 初始化音频设备

在使用插件之前,你需要初始化音频设备。你可以使用 MaDeviceManager 来管理音频设备。

import 'package:coast_audio_miniaudio/coast_audio_miniaudio.dart';

void initializeAudioDevice() {
  final deviceManager = MaDeviceManager();
  deviceManager.init();
  // 你可以在这里获取设备信息或选择设备
}

3. 播放音频

你可以使用 MaPlayer 来播放音频文件。以下是一个简单的示例:

import 'package:coast_audio_miniaudio/coast_audio_miniaudio.dart';

void playAudio() async {
  final deviceManager = MaDeviceManager();
  deviceManager.init();

  final player = MaPlayer(
    deviceManager: deviceManager,
    filePath: 'path/to/your/audio/file.mp3', // 替换为你的音频文件路径
  );

  player.play();

  // 你可以在这里添加一些逻辑来控制播放,比如暂停、停止等
}

4. 录制音频

你也可以使用 MaRecorder 来录制音频。以下是一个简单的示例:

import 'package:coast_audio_miniaudio/coast_audio_miniaudio.dart';

void recordAudio() async {
  final deviceManager = MaDeviceManager();
  deviceManager.init();

  final recorder = MaRecorder(
    deviceManager: deviceManager,
    filePath: 'path/to/save/recording.wav', // 替换为你想要保存录音的路径
  );

  recorder.startRecording();

  // 你可以在这里添加一些逻辑来控制录制,比如停止录制等
}

5. 音频格式转换

coast_audio_miniaudio 还支持音频格式转换。你可以使用 MaConverter 来将音频数据从一种格式转换为另一种格式。

import 'package:coast_audio_miniaudio/coast_audio_miniaudio.dart';

void convertAudio() async {
  final deviceManager = MaDeviceManager();
  deviceManager.init();

  final converter = MaConverter(
    deviceManager: deviceManager,
    inputFilePath: 'path/to/input/audio/file.mp3', // 输入文件路径
    outputFilePath: 'path/to/output/audio/file.wav', // 输出文件路径
  );

  converter.convert();

  // 你可以在这里添加一些逻辑来控制转换过程
}

6. 处理音频数据流

如果你需要处理音频数据流,可以使用 MaDataStream 来读取和写入音频数据。

import 'package:coast_audio_miniaudio/coast_audio_miniaudio.dart';

void processAudioStream() async {
  final deviceManager = MaDeviceManager();
  deviceManager.init();

  final dataStream = MaDataStream(
    deviceManager: deviceManager,
    filePath: 'path/to/audio/file.mp3', // 音频文件路径
  );

  // 读取音频数据
  final buffer = List<int>.filled(1024, 0);
  final bytesRead = dataStream.read(buffer);

  // 处理音频数据
  // ...

  // 写入音频数据
  dataStream.write(buffer);
}

7. 释放资源

在使用完音频设备后,记得释放资源以避免内存泄漏。

void releaseResources() {
  final deviceManager = MaDeviceManager();
  deviceManager.dispose();
}

8. 处理错误

在使用插件时,可能会遇到各种错误。你可以使用 try-catch 块来捕获并处理这些错误。

void handleErrors() {
  try {
    // 你的音频处理代码
  } catch (e) {
    print('An error occurred: $e');
  }
}
回到顶部