Flutter音频播放插件simple_audio_player的使用

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

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插件进行基本的音频播放控制。你可以根据需要扩展这个示例,例如添加播放进度条、音量控制等功能。

回到顶部