Flutter音频处理插件flutter_pcm_sound的使用
Flutter音频处理插件flutter_pcm_sound的使用
插件简介
flutter_pcm_sound
是一个用于将实时PCM音频(16位整数)发送到设备扬声器的Flutter插件。它没有额外的依赖,除了Flutter、Android、iOS和MacOS本身。与其它插件不同的是,flutter_pcm_sound
不是用于播放音频文件,而是用于生成实时音频的应用,例如使用dart_melty_soundfont。
主要特性
- 无依赖:除了Flutter、Android、iOS和MacOS外,没有任何其他依赖。
- 非音频文件:不使用音频文件,而是用于实时生成音频。
- 基于回调的实时音频:使用
setFeedCallback
回调函数来通知何时需要提供更多的样本。 - 一键操作:通过调用
feed
方法开始播放音频,停止调用feed
方法则停止播放。
使用方法
以下是一个简单的示例,展示了如何使用flutter_pcm_sound
插件:
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_pcm_sound/flutter_pcm_sound.dart';
const int sampleRate = 44100;
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return PcmSoundApp();
}
}
class PcmSoundApp extends StatefulWidget {
@override
_PcmSoundAppState createState() => _PcmSoundAppState();
}
class _PcmSoundAppState extends State<PcmSoundApp> {
int _remainingFrames = 0;
MajorScale scale = MajorScale(sampleRate: sampleRate, noteDuration: 0.20);
@override
void initState() {
super.initState();
FlutterPcmSound.setLogLevel(LogLevel.verbose);
FlutterPcmSound.setup(sampleRate: sampleRate, channelCount: 1);
if (Platform.isAndroid) {
FlutterPcmSound.setFeedThreshold(-1);
} else {
FlutterPcmSound.setFeedThreshold(sampleRate ~/ 30);
}
FlutterPcmSound.setFeedCallback(_onFeed);
}
@override
void dispose() {
super.dispose();
FlutterPcmSound.release();
}
void _onFeed(int remainingFrames) async {
setState(() {
_remainingFrames = remainingFrames;
});
if (remainingFrames < 6000) {
List<int> frames = scale.generate(periods: 10);
await FlutterPcmSound.feed(PcmArrayInt16.fromList(frames));
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text('Flutter PCM Sound'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ElevatedButton(
onPressed: () {
FlutterPcmSound.setFeedCallback(_onFeed);
_onFeed(0); // start feeding
},
child: Text('Play'),
),
ElevatedButton(
onPressed: () {
FlutterPcmSound.setFeedCallback(null); // stop
setState(() {
_remainingFrames = 0;
});
},
child: Text('Stop'),
),
Text('$_remainingFrames Remaining Frames')
],
),
),
),
);
}
}
关键步骤说明
-
初始化设置:
- 设置日志级别为详细模式。
- 初始化音频参数(采样率和声道数)。
- 根据平台设置不同的喂入阈值。
-
回调函数:
_onFeed
函数在需要更多音频帧时被调用。- 当剩余帧数小于6000时,生成新的音频帧并喂入。
-
UI交互:
- 提供两个按钮用于控制音频的播放和停止。
- 显示当前剩余的音频帧数。
示例应用
要运行示例应用,请执行以下命令:
cd ./example
flutter config --enable-macos-desktop
flutter config --enable-android
flutter config --enable-ios
flutter create .
flutter run
这样你就可以在支持的平台上测试flutter_pcm_sound
插件的功能了。
结语
希望这篇文章能帮助你了解和使用flutter_pcm_sound
插件。如果你有任何问题或建议,欢迎在GitHub上提交Issue或Pull Request。请记得给这个项目一个Star,让更多人受益于这个插件! ⭐
更多关于Flutter音频处理插件flutter_pcm_sound的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter音频处理插件flutter_pcm_sound的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用flutter_pcm_sound
插件进行音频处理的代码案例。这个插件允许你通过PCM(Pulse Code Modulation)格式来处理音频数据。以下是一个基本的示例,展示了如何播放和录制音频。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加flutter_pcm_sound
依赖:
dependencies:
flutter:
sdk: flutter
flutter_pcm_sound: ^最新版本号 # 请替换为实际发布的最新版本号
然后运行flutter pub get
来获取依赖。
2. 导入包并初始化
在你的Dart文件中导入包并初始化FlutterPcmSound
:
import 'package:flutter/material.dart';
import 'package:flutter_pcm_sound/flutter_pcm_sound.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: AudioProcessingScreen(),
);
}
}
class AudioProcessingScreen extends StatefulWidget {
@override
_AudioProcessingScreenState createState() => _AudioProcessingScreenState();
}
class _AudioProcessingScreenState extends State<AudioProcessingScreen> {
late FlutterPcmSound pcmSound;
@override
void initState() {
super.initState();
pcmSound = FlutterPcmSound();
}
@override
void dispose() {
pcmSound.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter PCM Sound Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () async {
await playAudio();
},
child: Text('Play Audio'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
await recordAudio();
},
child: Text('Record Audio'),
),
],
),
),
);
}
Future<void> playAudio() async {
try {
// 假设你有一个PCM格式的音频文件路径
String audioFilePath = 'path_to_your_pcm_audio_file.pcm';
await pcmSound.play(audioFilePath);
} catch (e) {
print('Error playing audio: $e');
}
}
Future<void> recordAudio() async {
try {
// 设置录音配置
final Map<String, dynamic> config = {
'sampleRate': 44100, // 采样率
'channels': 1, // 单声道
'bitDepth': 16, // 位深度
};
// 开始录音
await pcmSound.startRecording(config);
// 录音5秒钟后停止
await Future.delayed(Duration(seconds: 5));
await pcmSound.stopRecording('output_audio.pcm');
print('Recording saved to output_audio.pcm');
} catch (e) {
print('Error recording audio: $e');
}
}
}
3. 权限配置
如果你需要录制音频,你需要在AndroidManifest.xml
和Info.plist
文件中添加相应的权限。
Android
在android/app/src/main/AndroidManifest.xml
中添加:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
iOS
在ios/Runner/Info.plist
中添加:
<key>NSMicrophoneUsageDescription</key>
<string>We need your permission to use the microphone</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>We need your permission to save audio files</string>
注意事项
- PCM文件路径:确保你提供的PCM文件路径是正确的,并且文件存在。
- 权限处理:在实际应用中,你应该处理权限请求,确保用户已经授予了必要的权限。
- 音频格式:PCM是一种原始的音频格式,不包含任何压缩或编码。确保你的音频处理逻辑与PCM格式兼容。
这个示例代码展示了如何使用flutter_pcm_sound
插件进行基本的音频播放和录制。根据你的需求,你可以进一步扩展和自定义这些功能。