Flutter音频处理插件coast_audio的使用
Flutter音频处理插件coast_audio的使用
coast_audio
是一个高性能的Dart编写的音频处理库,旨在提供无Flutter依赖的低级音频功能。
特性
- 音频缓冲区管理
- 环形缓冲区管理
- 音频节点图系统(解码器节点、混音器节点、函数节点、音量节点)
- 编码和解码机制(Wav音频编码/解码)
- 波形生成(正弦波、三角波、方波、锯齿波)
- 音频设备输入输出(播放、捕获)
- 音频格式管理和转换
支持平台
Android | iOS | macOS | Windows | Linux | Web |
---|---|---|---|---|---|
✅ | ✅ | ✅ | ⚠️ | ✅ | ❌ |
Windows平台尚未测试,但若本地库正确编译应可工作。
安装
在 pubspec.yaml
中添加以下内容:
dependencies:
coast_audio: ^1.0.0
Android
- 在项目中创建新目录
android/src/main/jniLibs
。 - 将
{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
- 将
{ARCH}/libcoast_audio.so
文件从native/prebuilt/linux
目录复制到项目中的linux/libs
目录。 - 在
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 回复