Flutter音频流处理插件sound_stream_now的使用
Flutter音频流处理插件sound_stream_now的使用
sound_stream_now 是一个用于实时音频流处理的 Flutter 插件。它允许开发者从麦克风获取音频数据流,并将数据发送到音频引擎进行播放或进一步处理。目前该插件支持 Android 和 iOS 平台,且支持同时录音和播放。
当前功能:
- 提供从麦克风获取的音频数据流(类型为
Uint8List)。 - 支持接收原始音频数据流并播放(类型为
Uint8List)。 - 同时支持 Android 和 iOS(跨平台)。
- 录音器和播放器可以同时工作。
限制:
- 目前仅支持 PCM 16位单声道。
- 数据在流中发送和接收必须为
Uint8List类型(这是由于 Flutter 的平台通道限制)。
待办事项:
- 支持更多音频格式。
- 支持更多平台(如 Windows、macOS、Web)。
- 代码可能需要清理以提高可维护性。
使用示例
以下是一个完整的示例代码,展示如何使用 sound_stream_now 插件实现录音和播放功能。
示例代码
import 'dart:async';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:sound_stream_now/sound_stream_now.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
RecorderStream _recorder = RecorderStream(); // 录音器实例
PlayerStream _player = PlayerStream(); // 播放器实例
List<Uint8List> _micChunks = []; // 存储录音数据
bool _isRecording = false; // 是否正在录音
bool _isPlaying = false; // 是否正在播放
late StreamSubscription _recorderStatus; // 录音状态监听
late StreamSubscription _playerStatus; // 播放状态监听
late StreamSubscription _audioStream; // 音频数据流监听
[@override](/user/override)
void initState() {
super.initState();
initPlugin(); // 初始化插件
}
[@override](/user/override)
void dispose() {
_recorderStatus?.cancel(); // 取消录音状态监听
_playerStatus?.cancel(); // 取消播放状态监听
_audioStream?.cancel(); // 取消音频数据流监听
super.dispose();
}
// 初始化插件
Future<void> initPlugin() async {
_recorderStatus = _recorder.status.listen((status) {
if (mounted)
setState(() {
_isRecording = status == SoundStreamStatus.Playing; // 更新录音状态
});
});
_audioStream = _recorder.audioStream.listen((data) {
if (_isPlaying) {
_player.writeChunk(data); // 如果正在播放,则写入播放器
} else {
_micChunks.add(data); // 如果未播放,则存储录音数据
}
});
_playerStatus = _player.status.listen((status) {
if (mounted)
setState(() {
_isPlaying = status == SoundStreamStatus.Playing; // 更新播放状态
});
});
await Future.wait([ // 确保录音器和播放器都已初始化
_recorder.initialize(),
_player.initialize(),
]);
}
// 开始播放录音数据
void _play() async {
await _player.start();
if (_micChunks.isNotEmpty) { // 如果有录音数据,则逐段播放
for (var chunk in _micChunks) {
await _player.writeChunk(chunk);
}
_micChunks.clear(); // 清空录音数据
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('sound_stream_now 示例'), // 应用标题
),
body: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround, // 按钮水平居中分布
children: [
IconButton(
iconSize: 96.0, // 图标大小
icon: Icon(_isRecording ? Icons.mic_off : Icons.mic), // 图标根据状态切换
onPressed: _isRecording ? _recorder.stop : _recorder.start, // 切换录音状态
),
IconButton(
iconSize: 96.0,
icon: Icon(_isPlaying ? Icons.pause : Icons.play_arrow), // 图标根据状态切换
onPressed: _isPlaying ? _player.stop : _play, // 切换播放状态
),
],
),
),
);
}
}
更多关于Flutter音频流处理插件sound_stream_now的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter音频流处理插件sound_stream_now的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
sound_stream_now 是一个用于 Flutter 的音频流处理插件,它允许你从麦克风捕获音频流,并对音频数据进行实时处理。这个插件通常用于需要实时音频处理的应用场景,比如语音识别、音频分析等。
安装插件
首先,你需要在 pubspec.yaml 文件中添加 sound_stream_now 插件的依赖:
dependencies:
flutter:
sdk: flutter
sound_stream_now: ^0.0.1 # 请使用最新版本
然后运行 flutter pub get 来安装插件。
基本用法
以下是一个简单的示例,展示了如何使用 sound_stream_now 插件来捕获音频流并处理音频数据。
import 'package:flutter/material.dart';
import 'package:sound_stream_now/sound_stream_now.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: AudioStreamExample(),
);
}
}
class AudioStreamExample extends StatefulWidget {
[@override](/user/override)
_AudioStreamExampleState createState() => _AudioStreamExampleState();
}
class _AudioStreamExampleState extends State<AudioStreamExample> {
SoundStreamNow _soundStream = SoundStreamNow();
bool _isRecording = false;
[@override](/user/override)
void initState() {
super.initState();
_soundStream.onAudioData.listen((data) {
// 在这里处理音频数据
print("Received audio data: ${data.length} bytes");
});
}
void _toggleRecording() async {
if (!_isRecording) {
await _soundStream.start();
} else {
await _soundStream.stop();
}
setState(() {
_isRecording = !_isRecording;
});
}
[@override](/user/override)
void dispose() {
_soundStream.stop();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('SoundStreamNow Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
_isRecording ? 'Recording...' : 'Not Recording',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _toggleRecording,
child: Text(_isRecording ? 'Stop Recording' : 'Start Recording'),
),
],
),
),
);
}
}

