Flutter音频播放插件flutter_radio_player的使用
Flutter音频播放插件flutter_radio_player的使用
Flutter Radio Player
Flutter Radio Player 是一个用于播放单个流媒体URL的插件,它支持开箱即用的后台音乐播放,并与平台原生媒体控件无缝集成。无论是锁屏媒体控件还是更深层次的集成(如watchOS、CarPlay、WearOS或Android Auto),Flutter Radio Player都能轻松应对。
特性
- 后台播放:无需任何配置即可在后台播放音频。
- 手表集成:与WatchOS和WearOS无缝集成,提供原生手表控制。
- 汽车系统支持:支持Apple CarPlay和Android Auto等车载娱乐系统。
- 默认响应式:自动响应流的变化。
- ICY/Metadata提取:如果可用,提取流媒体元数据。
快速开始
1. 安装插件
flutter pub add flutter_radio_player
2. 导入库
import 'package:flutter_radio_player/flutter_radio_player.dart';
3. 配置播放器
final _flutterRadioPlayerPlugin = FlutterRadioPlayer(); // 创建播放器实例
_flutterRadioPlayerPlugin.initialize(
[
{"url": "https://s2-webradio.antenne.de/chillout?icy=https"},
{
"title": "SunFM - Sri Lanka",
"artwork": "images/sample-cover.jpg", // 图片需要打包到应用中
"url": "https://radio.lotustechnologieslk.net:2020/stream/sunfmgarden?icy=https",
},
{"url": "http://stream.riverradio.com:8000/wcvofm.aac"}
],
true, // 加载时自动播放
);
操作播放器
方法 | 动作 |
---|---|
play() |
播放当前音源 |
pause() |
暂停播放 |
playOrPause() |
切换播放/暂停 |
changeVolume() |
调整音量 |
getVolume() |
获取当前音量 |
nextSource() |
跳到下一个音源(如果有) |
previousSource() |
返回上一个音源 |
jumpToSourceIndex() |
跳转到音源列表中的特定索引 |
可用流
流 | 返回类型 | 描述 |
---|---|---|
getIsPlayingStream() |
Stream<bool> |
发出播放状态 |
getNowPlayingStream() |
Stream<NowPlayingDataChanged> |
发出如曲目名称等元数据 |
getDeviceVolumeChangedStream() |
Stream<double> |
发出设备音量更新 |
平台配置
iOS
要启用后台播放,请在Xcode中配置后台功能:
Android
确保在AndroidManifest.xml
中添加以下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
这些权限已包含在库中。
示例代码
import 'package:flutter/material.dart';
import 'package:flutter_radio_player/flutter_radio_player.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final _flutterRadioPlayerPlugin = FlutterRadioPlayer();
double volume = 0;
@override
void initState() {
super.initState();
_flutterRadioPlayerPlugin.initialize(
[
{
"url": "https://s2-webradio.antenne.de/chillout?icy=https",
},
{
"title": "SunFM - Sri Lanka",
"artwork": "images/sample-cover.jpg",
"url":
"https://radio.lotustechnologieslk.net:2020/stream/sunfmgarden?icy=https",
},
{"url": "http://stream.riverradio.com:8000/wcvofm.aac"}
],
true,
);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Center(
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
IconButton(
onPressed: () async {
await _flutterRadioPlayerPlugin.prevSource();
},
icon: const Icon(Icons.skip_previous_sharp),
),
StreamBuilder(
stream: _flutterRadioPlayerPlugin.getPlaybackStream(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return IconButton(
onPressed: () {
if (snapshot.data!) {
_flutterRadioPlayerPlugin.pause();
} else {
_flutterRadioPlayerPlugin.play();
}
},
icon: !snapshot.data!
? Icon(Icons.play_arrow)
: Icon(Icons.pause),
iconSize: 50.0,
);
}
return const Text("Player unavailable");
},
),
IconButton(
onPressed: () async {
await _flutterRadioPlayerPlugin.nextSource();
},
icon: const Icon(Icons.skip_next_sharp),
),
],
),
StreamBuilder(
stream: _flutterRadioPlayerPlugin.getNowPlayingStream(),
builder: (context, snapshot) {
if (snapshot.hasData && snapshot.data?.title != null) {
return Text("Now playing : ${snapshot.data?.title}");
}
return Text("N/A");
},
),
StreamBuilder(
stream:
_flutterRadioPlayerPlugin.getDeviceVolumeChangedStream(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(
"Volume = ${snapshot.data?.volume.floor()} and IsMuted = ${snapshot.data?.isMuted}");
}
return Text("No Vol data");
},
),
FutureBuilder(
future: _flutterRadioPlayerPlugin.getVolume(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Slider(
value: snapshot.data ?? 0,
min: 0,
max: 1,
onChanged: (value) {
setState(() {
volume = value;
_flutterRadioPlayerPlugin.setVolume(volume);
});
},
);
}
return Container();
},
)
],
),
),
),
);
}
}
以上是关于flutter_radio_player
插件的详细介绍和示例代码,希望对您有所帮助!如果您有任何问题或需要进一步的帮助,请随时提问。
更多关于Flutter音频播放插件flutter_radio_player的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter音频播放插件flutter_radio_player的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用 flutter_radio_player
插件在 Flutter 应用中实现音频播放的示例代码。这个插件主要用于播放网络电台流,但也可以用于播放其他类型的音频文件。
首先,确保你已经在 pubspec.yaml
文件中添加了 flutter_radio_player
依赖:
dependencies:
flutter:
sdk: flutter
flutter_radio_player: ^x.y.z # 请替换为最新版本号
然后,运行 flutter pub get
来获取依赖。
接下来,在你的 Flutter 应用中实现音频播放功能。下面是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:flutter_radio_player/flutter_radio_player.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Radio Player Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: RadioPlayerScreen(),
);
}
}
class RadioPlayerScreen extends StatefulWidget {
@override
_RadioPlayerScreenState createState() => _RadioPlayerScreenState();
}
class _RadioPlayerScreenState extends State<RadioPlayerScreen> {
FlutterRadioPlayer _radioPlayer = FlutterRadioPlayer();
@override
void initState() {
super.initState();
// 初始化电台 URL
String radioUrl = 'http://example.com/radio-stream'; // 请替换为有效的电台流 URL
_radioPlayer.setUrl(radioUrl);
// 监听播放状态变化
_radioPlayer.playerStateChanged.listen((state) {
print('Player state changed: $state');
});
}
@override
void dispose() {
_radioPlayer.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Radio Player Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () async {
// 播放电台
await _radioPlayer.play();
},
child: Text('Play'),
),
SizedBox(height: 16),
ElevatedButton(
onPressed: () async {
// 暂停电台
await _radioPlayer.pause();
},
child: Text('Pause'),
),
SizedBox(height: 16),
ElevatedButton(
onPressed: () async {
// 停止电台
await _radioPlayer.stop();
},
child: Text('Stop'),
),
],
),
),
);
}
}
在这个示例中,我们创建了一个简单的 Flutter 应用,其中包含一个 FlutterRadioPlayer
实例。我们在 initState
方法中设置了电台流的 URL,并监听了播放状态的变化。然后,我们在界面上放置了三个按钮,分别用于播放、暂停和停止电台。
请注意,你需要将 http://example.com/radio-stream
替换为一个有效的电台流 URL。
这个示例展示了如何使用 flutter_radio_player
插件的基本功能。根据你的需求,你可以进一步扩展这个示例,例如添加音量控制、当前播放时间显示等功能。