Flutter音频处理插件coast_audio的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter音频处理插件coast_audio的使用

coast_audio 是一个高性能的Dart编写的音频处理库,旨在提供无Flutter依赖的低级音频功能。

特性

  • 音频缓冲区管理
  • 环形缓冲区管理
  • 音频节点图系统(解码器节点、混音器节点、函数节点、音量节点)
  • 编码和解码机制(Wav音频编码/解码)
  • 波形生成(正弦波、三角波、方波、锯齿波)
  • 音频设备输入输出(播放、捕获)
  • 音频格式管理和转换

支持平台

Android iOS macOS Windows Linux Web
⚠️

Windows平台尚未测试,但若本地库正确编译应可工作。

安装

pubspec.yaml 中添加以下内容:

dependencies:
  coast_audio: ^1.0.0

Android

  1. 在项目中创建新目录 android/src/main/jniLibs
  2. {ABI}/libcoast_audio.so 文件从 native/prebuilt/android 目录复制到 jniLibs 目录。

macOS/iOS

Podfile 中添加以下内容:

target 'Runner' do
  ...
  pod 'CoastAudio', :git => 'https://github.com/SKKbySSK/coast_audio.git', :tag => '1.0.0':
end

AppDelegate.swift 文件中添加以下导入和调用:

import CoastAudio // 1. 添加导入

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    CoastAudioSymbolKeeper.keep() // 2. 添加此行以防止本地符号被剥离
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

Linux

  1. {ARCH}/libcoast_audio.so 文件从 native/prebuilt/linux 目录复制到项目中的 linux/libs 目录。
  2. linux/CMakeLists.txt 中添加以下内容:
install(FILES "linux/libs/${CMAKE_SYSTEM_PROCESSOR}/libcoast_audio.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime)

Windows

需手动构建本地库。

使用示例

生成正弦波

// 定义音频格式,采样率为48khz,单声道
final format = AudioFormat(sampleRate: 48000, channels: 1, sampleFormat: SampleFormat.int16);

// 创建频率为440hz的正弦波函数节点
final functionNode = FunctionNode(
  function: const SineFunction(),
  frequency: 440,
);

AllocatedAudioFrames(length: 1024, format: format).acquireBuffer((buffer) {
  // 从函数节点读取音频数据到缓冲区
  functionNode.outputBus.read(buffer);

  // floatList 包含正弦波音频数据
  final floatList = buffer.asFloat32ListView();
});

生成Wav文件

final format = AudioFormat(sampleRate: 48000, channels: 1, sampleFormat: SampleFormat.int16);
final functionNode = FunctionNode(
  function: const SineFunction(),
  frequency: 440,
);

final fileOutput = AudioFileDataSource(
  file: File('output.wav'),
  mode: FileMode.write,
);

final encoder = WavAudioEncoder(dataSource: fileOutput, inputFormat: format);
encoder.start();

final duration = AudioTime(10);
AllocatedAudioFrames(length: duration.computeFrames(format), format: format).acquireBuffer((buffer) {
  final result = functionNode.outputBus.read(buffer);
  encoder.encode(buffer.limit(result.frameCount));
});

encoder.finalize();

混合音频

const format = AudioFormat(sampleRate: 48000, channels: 1);
final mixerNode = MixerNode(format: format);

for (final freq in [264.0, 330.0, 396.0]) {
  final sineNode = FunctionNode(function: const SineFunction(), format: format, frequency: freq);
  final mixerInputBus = mixerNode.appendInputBus();
  sineNode.outputBus.connect(mixerInputBus);
}

AllocatedAudioFrames(length: 1024, format: format).acquireBuffer((buffer) {
  functionNode.outputBus.read(buffer);
  final floatList = buffer.asFloat32ListView();
});

播放、录制和回环

coast_audio 提供了 AudioDevice 类来处理音频设备的输入输出。具体实现可以参考以下示例:

Q&A

是否可以在Flutter中使用此包?

可以,但建议在单独的隔离环境中使用,以避免阻塞Flutter主线程。

是否可以在Web上使用 coast_audio

目前不支持,建议使用 dart:web_audio

更多详情请参考官方示例


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

1 回复

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


当然,以下是一个关于如何使用Flutter音频处理插件coast_audio的代码示例。这个插件允许你在Flutter应用中处理音频数据。为了简洁起见,以下示例将展示如何初始化插件、加载音频文件并播放它。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  coast_audio: ^最新版本号  # 请替换为最新版本号

2. 导入插件

在你的Dart文件中导入coast_audio插件:

import 'package:coast_audio/coast_audio.dart';

3. 初始化插件并加载音频文件

在你的Flutter应用中,你可以使用以下代码来初始化插件并加载一个音频文件:

import 'package:flutter/material.dart';
import 'package:coast_audio/coast_audio.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Audio Processing',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AudioProcessingScreen(),
    );
  }
}

class AudioProcessingScreen extends StatefulWidget {
  @override
  _AudioProcessingScreenState createState() => _AudioProcessingScreenState();
}

class _AudioProcessingScreenState extends State<AudioProcessingScreen> {
  late CoastAudio coastAudio;

  @override
  void initState() {
    super.initState();
    // 初始化 CoastAudio 实例
    coastAudio = CoastAudio();

    // 加载音频文件
    loadAudio();
  }

  void loadAudio() async {
    // 假设你有一个音频文件位于 assets 文件夹中
    String audioFilePath = 'assets/sample.mp3';
    try {
      // 使用 coastAudio 加载音频文件
      await coastAudio.load(audioFilePath);
      // 播放音频
      coastAudio.play();
    } catch (e) {
      print('Error loading audio: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Processing'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Audio is loading and will play shortly...'),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 暂停播放
          coastAudio.pause();
        },
        tooltip: 'Pause',
        child: Icon(Icons.pause),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
    );
  }

  @override
  void dispose() {
    // 释放资源
    coastAudio.dispose();
    super.dispose();
  }
}

4. 确保音频文件在assets中

pubspec.yaml文件中确保你的音频文件被包含在assets中:

flutter:
  assets:
    - assets/sample.mp3

注意事项

  • coast_audio插件的具体方法和功能可能会随着版本的更新而变化,因此请参考官方文档以获取最新信息。
  • 在实际使用中,你可能需要处理音频播放的更多细节,如音量控制、进度条、播放结束回调等。
  • 请确保音频文件路径正确,并且文件已经包含在项目的assets目录中。

以上代码示例展示了如何使用coast_audio插件加载并播放一个音频文件。你可以根据需求进一步扩展功能,如添加音频处理效果等。

回到顶部