Flutter音频播放插件flutter_radio_player的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter音频播放插件flutter_radio_player的使用

Flutter Radio Player

logo

Pub Version Pub Likes Pub Points Pub Popularity

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中配置后台功能: Xcode Configuration

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

1 回复

更多关于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 插件的基本功能。根据你的需求,你可以进一步扩展这个示例,例如添加音量控制、当前播放时间显示等功能。

回到顶部