Flutter音频录制与播放插件flutter_sound的使用
Flutter音频录制与播放插件flutter_sound的使用
概述
Flutter Sound 是一个允许您在Flutter应用程序中播放和录制音频的包。它支持Android、iOS和Flutter Web平台,并提供了高级API和小部件,以实现播放和录制音频的功能。
主要特性
- 支持多种编解码器播放和录制音频或音乐。
- 播放本地或远程文件(通过URL指定)。
- 播放资源文件。
- 使用内置的SoundPlayerUI小部件播放音频。
- 自定义利用Flutter Sound API的播放界面。
- 使用内置的SoundRecorderUI小部件录制音频。
- 自定义利用Flutter Sound API的录音界面。
- 支持当应用程序暂停/恢复时释放/恢复资源。
- 录制到Dart Stream。
- 从Dart Stream回放。
- 可以从设备锁屏或Apple Watch控制应用程序回放。
示例代码
下面是一个完整的示例应用,展示了如何使用flutter_sound
进行简单的音频播放和录制。
import 'package:flutter/material.dart';
import 'package:flutter_sound/flutter_sound.dart';
import 'dart:io';
import 'dart:async';
class SimplePlayback extends StatefulWidget {
const SimplePlayback({super.key});
@override
_SimplePlaybackState createState() => _SimplePlaybackState();
}
class _SimplePlaybackState extends State<SimplePlayback> {
final FlutterSoundPlayer _audioPlayer = FlutterSoundPlayer();
bool _isPlaying = false;
@override
void initState() {
super.initState();
_audioPlayer.openAudioSession();
}
@override
void dispose() {
_audioPlayer.closeAudioSession();
super.dispose();
}
Future<void> _play() async {
await _audioPlayer.startPlayer(
fromURI: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3',
whenFinished: () {
setState(() {
_isPlaying = false;
});
},
);
setState(() {
_isPlaying = true;
});
}
Future<void> _stop() async {
await _audioPlayer.stopPlayer();
setState(() {
_isPlaying = false;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Simple Playback Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: _isPlaying ? null : _play,
child: const Text('Play'),
),
if (_isPlaying)
ElevatedButton(
onPressed: _stop,
child: const Text('Stop'),
),
],
),
),
);
}
}
简单录音示例
import 'package:flutter/material.dart';
import 'package:flutter_sound/flutter_sound.dart';
import 'dart:io';
import 'dart:async';
class SimpleRecorder extends StatefulWidget {
const SimpleRecorder({super.key});
@override
_SimpleRecorderState createState() => _SimpleRecorderState();
}
class _SimpleRecorderState extends State<SimpleRecorder> {
final FlutterSoundRecorder _audioRecorder = FlutterSoundRecorder();
String? _recordingPath;
bool _isRecording = false;
@override
void initState() {
super.initState();
_audioRecorder.openAudioSession();
}
@override
void dispose() {
_audioRecorder.closeAudioSession();
super.dispose();
}
Future<void> _startRecording() async {
if (!await _audioRecorder.isEncoderAvailable(Codec.aacADTS)) {
print('Encoder not available');
return;
}
final path = './test.aac';
await _audioRecorder.startRecorder(toFile: path);
setState(() {
_recordingPath = path;
_isRecording = true;
});
}
Future<void> _stopRecording() async {
final result = await _audioRecorder.stopRecorder();
setState(() {
_recordingPath = result;
_isRecording = false;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Simple Recorder Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: _isRecording ? null : _startRecording,
child: const Text('Start Recording'),
),
if (_isRecording)
ElevatedButton(
onPressed: _stopRecording,
child: const Text('Stop Recording'),
),
],
),
),
);
}
}
集成到主应用
为了集成上述功能到您的Flutter应用程序中,您可以创建一个包含这些页面的应用入口点:
void main() {
runApp(MaterialApp(
home: ExamplesApp(),
));
}
class ExamplesApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Sound Examples',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const ExamplesAppHomePage(title: 'Flutter Sound Examples'),
);
}
}
class ExamplesAppHomePage extends StatefulWidget {
final String? title;
const ExamplesAppHomePage({Key? key, this.title}) : super(key: key);
@override
_ExamplesHomePageState createState() => _ExamplesHomePageState();
}
class _ExamplesHomePageState extends State<ExamplesAppHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title!),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => const SimplePlayback()));
},
child: const Text('Simple Playback'),
),
ElevatedButton(
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => const SimpleRecorder()));
},
child: const Text('Simple Recorder'),
),
],
),
),
);
}
}
以上就是使用flutter_sound
插件进行音频播放和录制的基本方法。希望这对您有所帮助!如果您有任何问题或需要进一步的帮助,请随时提问。
更多关于Flutter音频录制与播放插件flutter_sound的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter音频录制与播放插件flutter_sound的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter中使用flutter_sound
插件进行音频录制与播放的示例代码。flutter_sound
是一个功能强大的插件,支持跨平台的音频录制和播放功能。
首先,你需要在你的pubspec.yaml
文件中添加flutter_sound
依赖:
dependencies:
flutter:
sdk: flutter
flutter_sound: ^9.1.5 # 请检查最新版本号
然后运行flutter pub get
来安装依赖。
接下来是一个完整的示例代码,展示如何使用flutter_sound
进行音频录制和播放:
import 'package:flutter/material.dart';
import 'package:flutter_sound/flutter_sound.dart';
import 'dart:typed_data/typed_data.dart';
import 'dart:io';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Sound Demo'),
),
body: AudioControl(),
),
);
}
}
class AudioControl extends StatefulWidget {
@override
_AudioControlState createState() => _AudioControlState();
}
class _AudioControlState extends State<AudioControl> {
late FlutterSound flutterSound;
late FlutterSoundRecorder recorder;
late FlutterSoundPlayer player;
bool isRecording = false;
bool isPlaying = false;
String? filePath;
@override
void initState() {
super.initState();
flutterSound = FlutterSound();
recorder = flutterSound.recorder;
player = flutterSound.player;
// 配置录音设置
recorder.setSubscriptionDurationInMs(1000); // 每秒回调一次
recorder.setAudioEncoder(AudioEncoder.AAC);
recorder.setOutputFormat(OutputFormat.THREE_GPP);
recorder.setAudioSampleRate(44100);
recorder.setNumberOfChannels(1);
recorder.setBitRate(128000);
// 配置播放设置
player.setVolume(1.0);
// 初始化FlutterSound
flutterSound.openRecorder().then((_) {
print("Recorder initialized");
}).catchError((e) {
print("Error initializing recorder: $e");
});
}
@override
void dispose() {
flutterSound.close();
super.dispose();
}
void startRecording() async {
if (!isRecording) {
filePath = (await getApplicationDocumentsDirectory()).path + "/audio_record.3gp";
await recorder.startRecorder(filePath!);
setState(() {
isRecording = true;
});
}
}
void stopRecording() async {
if (isRecording) {
await recorder.stopRecorder();
setState(() {
isRecording = false;
});
}
}
void playRecording() async {
if (filePath != null && !isPlaying) {
await player.startPlayer(filePath!);
setState(() {
isPlaying = true;
});
}
}
void stopPlaying() async {
if (isPlaying) {
await player.stopPlayer();
setState(() {
isPlaying = false;
});
}
}
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
ElevatedButton(
onPressed: startRecording,
child: Text("Start Recording"),
style: ButtonStyle(
overlayColor: MaterialStateProperty.all(isRecording ? Colors.red : Colors.blue),
),
),
ElevatedButton(
onPressed: stopRecording,
child: Text("Stop Recording"),
style: ButtonStyle(
overlayColor: MaterialStateProperty.all(isRecording ? Colors.green : Colors.grey),
),
),
SizedBox(height: 16),
ElevatedButton(
onPressed: playRecording,
child: Text("Play Recording"),
style: ButtonStyle(
overlayColor: MaterialStateProperty.all(isPlaying ? Colors.red : Colors.blue),
),
),
ElevatedButton(
onPressed: stopPlaying,
child: Text("Stop Playing"),
style: ButtonStyle(
overlayColor: MaterialStateProperty.all(isPlaying ? Colors.green : Colors.grey),
),
),
],
),
);
}
}
注意事项
-
权限:
- 在Android上,你需要在
AndroidManifest.xml
中请求录音和写存储权限。 - 在iOS上,你需要在
Info.plist
中添加相应的权限描述。
- 在Android上,你需要在
-
错误处理:
- 示例代码中没有包含详细的错误处理逻辑,实际项目中应添加必要的错误处理。
-
UI更新:
- 示例中使用了
setState
来更新UI状态,确保UI与音频录制和播放状态同步。
- 示例中使用了
-
资源管理:
- 确保在
dispose
方法中关闭FlutterSound
实例,以避免资源泄漏。
- 确保在
-
路径处理:
- 示例中使用了
getApplicationDocumentsDirectory()
来获取应用的文档目录路径,用于存储录音文件。
- 示例中使用了
希望这个示例能帮助你理解如何在Flutter中使用flutter_sound
插件进行音频录制和播放。