Flutter音频播放插件simple_audio_player的使用
Flutter音频播放插件simple_audio_player的使用
安装启动
步骤 1
在你的 pubspec.yaml
文件中添加以下依赖:
dependencies:
simple_audio_player: ^1.0.2
步骤 2
执行以下命令安装依赖:
$ flutter packages get
常规用法
[@override](/user/override)
void initState() {
super.initState();
simpleAudioPlayer = SimpleAudioPlayer();
simpleAudioPlayer.songStateStream.listen((event) {
print("song event : $event");
});
focusManager.audioFocusStream.listen((event) {
print("focus event : $event");
});
focusManager.becomingNoisyStream.listen((event) {
print("becoming noisy event : $event");
});
notificationManager.notificationStream.listen((event) {
print("notification event : $event");
});
}
// ...
CupertinoButton(
child: Text("请求音频焦点"),
onPressed: () {
SimpleAudioFocusManager().tryToGetAudioFocus().then((value) {
print("tryToGetAudioFocus $value");
});
},
),
CupertinoButton(
child: Text("放弃音频焦点"),
onPressed: () {
SimpleAudioFocusManager().giveUpAudioFocus();
},
),
CupertinoButton(
child: Text("准备播放"),
onPressed: () {
simpleAudioPlayer.prepare(
uri: "https://96.f.1ting.com/local_to_cube_202004121813/96kmp3/2021/04/16/16b_am/01.mp3");
},
),
CupertinoButton(
child: Text("播放"),
onPressed: () {
simpleAudioPlayer.play();
},
),
CupertinoButton(
child: Text("暂停"),
onPressed: () {
simpleAudioPlayer.pause();
},
),
CupertinoButton(
child: Text("停止"),
onPressed: () {
simpleAudioPlayer.stop();
},
),
CupertinoButton(
child: Text("显示通知"),
onPressed: () => notificationManager.showNotification(player: player, title: "标题", artist: "艺术家", clipArt: ""),
),
CupertinoButton(
child: Text("取消通知"),
onPressed: () => notificationManager.cancelNotification(),
),
特性
- 音频焦点管理器
- 支持在线播放MP3文件
- 支持本地播放MP3文件
- 支持资产文件播放MP3文件
- 音频通知管理器
- 监听噪音事件
完整示例代码
import 'dart:convert';
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';
import 'package:simple_audio_player/simple_audio_focus_manager.dart';
import 'package:simple_audio_player/simple_audio_notification_manager.dart';
import 'package:simple_audio_player/simple_audio_player.dart';
final url = "https://96.f.1ting.com/local_to_cube_202004121813/96kmp3/2021/04/16/16b_am/01.mp3";
final clipArt = "https://pics7.baidu.com/feed/a1ec08fa513d2697ebef4a6dc197c7fe4316d8b0.jpeg";
final asset = "asset:///audios/02.mp3";
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late SimpleAudioPlayer player;
final focusManager = SimpleAudioFocusManager();
final notificationManager = SimpleAudioNotificationManager();
double volumeValue = 1.0;
double rateValue = 1.0;
double sliderValue = 0;
File? file;
String clipArtBase64Data = "";
[@override](/user/override)
void initState() {
super.initState();
// 复制文件
Future.microtask(() async {
File file = File("${(await getTemporaryDirectory()).path}/audios/02.mp3");
if (!file.existsSync()) {
file.createSync(recursive: true);
final byteData = await rootBundle.load("audios/02.mp3");
await file.writeAsBytes(byteData.buffer.asUint8List());
}
setState(() {
this.file = file;
});
try {
final data = await http.get(Uri.parse(clipArt));
if (data.statusCode == 200) {
clipArtBase64Data = base64Encode(data.bodyBytes);
}
} catch (e) {
print(e);
}
});
player = SimpleAudioPlayer();
player.songStateStream.listen((event) {
if (event.state == SimpleAudioPlayerSongState.onReady) {
setState(() {
sliderValue = 0;
});
} else if (event.state == SimpleAudioPlayerSongState.onPositionChange) {
setState(() {
sliderValue = event.data[0] / event.data[1];
});
} else if (event.state == SimpleAudioPlayerSongState.onPlayEnd) {
setState(() {
sliderValue = 1;
});
}
print("song event : $event");
});
focusManager.audioFocusStream.listen((event) {
print("focus event : $event");
});
focusManager.becomingNoisyStream.listen((event) {
print("noisy event : $event");
});
notificationManager.notificationStream.listen((event) {
print("notification event : $event");
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('插件示例应用'),
),
body: Container(
constraints: BoxConstraints.expand(),
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
CupertinoButton(
child: Text("请求音频焦点"),
onPressed: () {
focusManager.tryToGetAudioFocus().then((value) {
print("tryToGetAudioFocus $value");
});
},
),
CupertinoButton(
child: Text("放弃音频焦点"),
onPressed: () => focusManager.giveUpAudioFocus(),
),
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text("准备音频:"),
CupertinoButton(
child: Text("URL", textAlign: TextAlign.center),
onPressed: () => player.prepare(uri: url),
),
CupertinoButton(
child: Text("资源文件", textAlign: TextAlign.center),
onPressed: () => player.prepare(uri: asset),
),
CupertinoButton(
child: Text("文件", textAlign: TextAlign.center),
onPressed: () => player.prepare(uri: "file://${file?.path}"),
),
],
),
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text("立即播放:"),
CupertinoButton(
child: Text("URL", textAlign: TextAlign.center),
onPressed: () {
player.prepare(uri: url);
player.setPlaybackRate(rate: rateValue);
player.play();
},
),
CupertinoButton(
child: Text("资源文件", textAlign: TextAlign.center),
onPressed: () {
player.prepare(uri: asset);
player.setPlaybackRate(rate: rateValue);
player.play();
},
),
CupertinoButton(
child: Text("文件", textAlign: TextAlign.center),
onPressed: () {
player.prepare(uri: "file://${file?.path}");
player.setPlaybackRate(rate: rateValue);
player.play();
},
),
],
),
Row(
mainAxisSize: MainAxisSize.min,
children: [
CupertinoButton(
child: Text("播放"),
onPressed: () {
player.setPlaybackRate(rate: rateValue);
player.play();
},
),
CupertinoButton(
child: Text("暂停"),
onPressed: () => player.pause(),
),
CupertinoButton(
child: Text("停止"),
onPressed: () => player.stop(),
),
],
),
SizedBox(height: 10),
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text("音量: "),
SizedBox(width: 20),
CupertinoSlider(
value: volumeValue,
onChanged: (changeValue) {
setState(() {
volumeValue = changeValue;
});
},
onChangeEnd: (changeValue) async {
player.setVolume(volume: changeValue);
},
),
],
),
SizedBox(height: 10),
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text("播放速度: "),
SizedBox(width: 20),
CupertinoSlider(
min: 0.5,
max: 2,
value: rateValue,
onChanged: (changeValue) {
setState(() {
rateValue = changeValue;
});
},
onChangeEnd: (changeValue) async {
player.setPlaybackRate(rate: changeValue);
},
),
],
),
SizedBox(height: 10),
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text("进度: "),
SizedBox(width: 20),
CupertinoSlider(
value: sliderValue,
onChanged: (changeValue) {
setState(() {
sliderValue = changeValue;
});
},
onChangeEnd: (changeValue) async {
final duration = await player.getDuration();
player.seekTo(position: (duration * changeValue).toInt());
},
),
],
),
CupertinoButton(
child: Text("显示通知"),
onPressed: () => notificationManager.showNotification(player: player, title: "标题", artist: "艺术家", clipArt: clipArtBase64Data),
),
CupertinoButton(
child: Text("取消通知"),
onPressed: () => notificationManager.cancelNotification(),
),
],
),
),
),
),
);
}
}
更多关于Flutter音频播放插件simple_audio_player的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter音频播放插件simple_audio_player的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用Flutter音频播放插件simple_audio_player
的代码案例。这个插件允许你在Flutter应用中播放音频文件。
首先,你需要在你的pubspec.yaml
文件中添加simple_audio_player
依赖:
dependencies:
flutter:
sdk: flutter
simple_audio_player: ^3.0.5 # 请检查最新版本号
然后运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter应用中使用SimpleAudioPlayer
来播放音频。以下是一个简单的示例代码:
import 'package:flutter/material.dart';
import 'package:simple_audio_player/simple_audio_player.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Audio Player Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: AudioPlayerScreen(),
);
}
}
class AudioPlayerScreen extends StatefulWidget {
@override
_AudioPlayerScreenState createState() => _AudioPlayerScreenState();
}
class _AudioPlayerScreenState extends State<AudioPlayerScreen> {
SimpleAudioPlayer _audioPlayer = SimpleAudioPlayer();
String _audioFilePath = 'assets/audio/sample.mp3'; // 请确保你的音频文件路径正确
@override
void initState() {
super.initState();
// 加载音频文件
_audioPlayer.load(_audioFilePath);
}
@override
void dispose() {
// 释放资源
_audioPlayer.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Audio Player Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () {
// 播放音频
_audioPlayer.play();
},
child: Text('Play'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// 暂停音频
_audioPlayer.pause();
},
child: Text('Pause'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// 停止音频
_audioPlayer.stop();
},
child: Text('Stop'),
),
],
),
),
);
}
}
在这个示例中,我们创建了一个简单的Flutter应用,包含一个音频播放屏幕。屏幕上有三个按钮:播放、暂停和停止。我们使用了SimpleAudioPlayer
类来加载和控制音频文件的播放。
请注意,音频文件应该放在你的项目的assets
文件夹中,并在pubspec.yaml
文件中声明它们:
flutter:
assets:
- assets/audio/sample.mp3
这个示例展示了如何使用simple_audio_player
插件进行基本的音频播放控制。你可以根据需要扩展这个示例,例如添加播放进度条、音量控制等功能。