Flutter音频播放插件simple_audio的使用

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

Flutter音频播放插件simple_audio的使用

Simple Audio简介

Simple Audio 是一个跨平台的Flutter插件,旨在为Flutter应用程序提供简单且稳定的音频播放功能。它支持多种平台(Android、Linux、Windows、iOS、macOS),并且可以播放本地和在线资源,具备无缝播放和预加载以及音量归一化等功能。

主要特性

  • 简单的API:易于使用的接口设计。
  • 跨平台支持:适用于多个操作系统。
  • 资源播放:无论是本地文件还是网络流媒体都能轻松处理。
  • 无缝切换与预加载:确保音频连续性,减少延迟。
  • 音量调整:内置音量归一化选项,保证不同来源的声音一致。

更多文档可以在pub.dev上找到。

使用步骤

  1. 添加依赖:在项目的pubspec.yaml文件中加入simple_audio作为依赖项。
  2. 初始化:在应用启动时调用SimpleAudio.init()方法来初始化音频服务。
  3. 创建播放器实例:通过SimpleAudio类创建一个新的播放器对象。
  4. 打开并播放音频:使用提供的API进行音频文件或流的加载与播放操作。

下面是一个完整的示例代码,展示了如何集成simple_audio到你的Flutter项目中,并实现基本的音频播放控制界面。

import 'dart:io';
import 'dart:math';

import 'package:flutter/material.dart';
import 'package:simple_audio/simple_audio.dart'; // 导入simple_audio包

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化simple_audio
  await SimpleAudio.init();
  
  // 创建播放器实例
  final SimpleAudio player = SimpleAudio(shouldNormalizeVolume: false);
  
  runApp(MyApp(player));
}

class MyApp extends StatelessWidget {
  final SimpleAudio player;

  const MyApp(this.player, {super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Simple Audio Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: MyHomePage(title: 'Simple Audio Player', player: player),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;
  final SimpleAudio player;

  const MyHomePage({required this.title, required this.player, Key? key}) : super(key: key);

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  PlaybackState playbackState = PlaybackState.stop;
  bool get isPlaying => playbackState == PlaybackState.play || playbackState == PlaybackState.preloadPlayed;
  double volume = 1.0;
  Duration position = Duration.zero;
  Duration duration = Duration.zero;

  void updatePlaybackState(PlaybackState newState) {
    setState(() {
      playbackState = newState;
    });
  }

  Future<void> pickAndPlayFile() async {
    FilePickerResult? result = await FilePicker.platform.pickFiles(type: FileType.audio);
    
    if (result != null && result.files.isNotEmpty) {
      String? path = result.files.first.path;
      if (path != null) {
        await widget.player.stop();
        await widget.player.open(path);
      }
    }
  }

  @override
  void initState() {
    super.initState();

    // 监听播放状态变化
    widget.player.playbackState.listen(updatePlaybackState);
    
    // 更新进度条信息
    widget.player.progressState.listen((state) {
      setState(() {
        position = state.position;
        duration = state.duration;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () => pickAndPlayFile(),
              child: const Text('选择并播放音频'),
            ),
            const SizedBox(height: 20),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                ElevatedButton(
                  onPressed: isPlaying ? widget.player.pause : widget.player.play,
                  child: Text(isPlaying ? '暂停' : '播放'),
                ),
                const SizedBox(width: 10),
                ElevatedButton(
                  onPressed: () async {
                    await widget.player.stop();
                    updatePlaybackState(PlaybackState.stop);
                  },
                  child: const Text('停止'),
                ),
              ],
            ),
            const SizedBox(height: 20),
            Slider(
              value: volume,
              min: 0.0,
              max: 1.0,
              onChanged: (value) {
                setState(() => volume = value);
                widget.player.setVolume(value);
              },
            ),
            Padding(
              padding: const EdgeInsets.symmetric(horizontal: 20),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  Text(_formatTime(position)),
                  Text(_formatTime(duration)),
                ],
              ),
            ),
            Slider(
              value: position.inSeconds.toDouble(),
              min: 0.0,
              max: duration.inSeconds.toDouble(),
              onChanged: (value) {
                widget.player.seek(Duration(seconds: value.toInt()));
              },
            ),
          ],
        ),
      ),
    );
  }

  String _formatTime(Duration d) => '${d.inMinutes}:${(d.inSeconds % 60).toString().padLeft(2, '0')}';
}

这段代码实现了以下功能:

  • 选择音频文件:允许用户从设备中挑选音频文件以供播放。
  • 控制播放/暂停/停止:提供了基础的播放控制按钮。
  • 调节音量:用户可以通过滑动条调整当前播放音频的音量大小。
  • 显示播放进度:实时更新当前播放位置及总时长,并允许拖拽滑块跳转到指定时间点。

请注意,在实际开发过程中,你可能还需要根据具体需求对代码做一些适当的修改和完善。此外,对于iOS平台,需要额外设置Xcode项目中的框架引用;而对于其他平台,则通常不需要特别配置即可正常工作。


更多关于Flutter音频播放插件simple_audio的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音频播放插件simple_audio的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个使用Flutter音频播放插件simple_audio的示例代码案例。这个插件允许你在Flutter应用中播放音频文件。

首先,你需要在你的Flutter项目的pubspec.yaml文件中添加simple_audio依赖:

dependencies:
  flutter:
    sdk: flutter
  simple_audio: ^2.1.3  # 请注意版本号,这里使用的是示例版本号,请检查最新版本

然后运行flutter pub get来获取依赖。

接下来,你可以在你的Flutter应用中使用simple_audio插件。以下是一个简单的示例,展示了如何播放音频文件:

import 'package:flutter/material.dart';
import 'package:simple_audio/simple_audio.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Simple Audio Example'),
        ),
        body: AudioPlayerScreen(),
      ),
    );
  }
}

class AudioPlayerScreen extends StatefulWidget {
  @override
  _AudioPlayerScreenState createState() => _AudioPlayerScreenState();
}

class _AudioPlayerScreenState extends State<AudioPlayerScreen> {
  late AudioPlayer audioPlayer;

  @override
  void initState() {
    super.initState();
    audioPlayer = AudioPlayer();
    audioPlayer.setAudioSourceFromUrl(
      AudioSource(
        url: 'https://www.example.com/path/to/your/audiofile.mp3',  // 替换为你的音频文件URL
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
            onPressed: () {
              audioPlayer.play();
              print('Playing audio...');
            },
            child: Text('Play'),
          ),
          SizedBox(height: 16),
          ElevatedButton(
            onPressed: () {
              audioPlayer.pause();
              print('Pausing audio...');
            },
            child: Text('Pause'),
          ),
          SizedBox(height: 16),
          ElevatedButton(
            onPressed: () {
              audioPlayer.stop();
              print('Stopping audio...');
            },
            child: Text('Stop'),
          ),
        ],
      ),
    );
  }

  @override
  void dispose() {
    audioPlayer.dispose();
    super.dispose();
  }
}

在这个示例中:

  1. 我们创建了一个AudioPlayer实例。
  2. initState方法中,我们设置了音频源,这里使用的是URL。如果你希望从本地文件播放,可以使用AudioSource.fromAssetAudioSource.fromUri方法。
  3. 我们创建了三个按钮来分别控制音频的播放、暂停和停止。
  4. dispose方法中,我们释放了audioPlayer资源,以避免内存泄漏。

请确保将AudioSourceurl替换为你实际的音频文件URL或路径。如果你从本地资源中播放音频,可以使用以下方式之一:

  • 使用AudioSource.fromAsset('assets/audiofile.mp3')从应用的assets文件夹中加载音频文件。
  • 使用AudioSource.fromUri(Uri.parse('file:///path/to/your/audiofile.mp3'))从本地文件系统中加载音频文件。

希望这个示例能够帮助你快速上手使用simple_audio插件进行音频播放。

回到顶部