Flutter音频文件播放插件audiofileplayer的使用

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

Flutter音频文件播放插件audiofileplayer的使用

audiofileplayer 是一个用于Flutter项目的音频播放插件,它支持从项目资源、本地文件、字节数组和远程URL读取音频数据。以下是该插件的主要功能:

  • 从Flutter项目资源、本地文件、字节数组或远程URL读取音频数据。
  • 支持快进到指定位置。
  • 提供回调函数以获取已加载音频时长、当前播放位置以及播放完成的通知。
  • 支持循环播放、调整音量、暂停/恢复播放。
  • 支持多个音频播放器,并具有内存管理功能。
  • 支持后台音频播放。
  • 可设置操作系统显示的支持媒体操作和元数据。
  • 在Android通知中添加自定义媒体按钮。

开始使用

要使用此插件,请在 pubspec.yaml 文件中将 audiofileplayer 添加为依赖项。

dependencies:
  audiofileplayer: ^0.3.2 # 请确保使用最新版本

然后执行 flutter pub get 来安装插件。

示例代码

下面是一个完整的示例应用程序,展示了如何使用 audiofileplayer 插件进行不同场景下的音频播放。

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AudioPlayerExample(),
    );
  }
}

class AudioPlayerExample extends StatefulWidget {
  @override
  _AudioPlayerExampleState createState() => _AudioPlayerExampleState();
}

class _AudioPlayerExampleState extends State<AudioPlayerExample> {
  late Audio _audio;
  bool _isPlaying = false;
  double? _durationSeconds;
  double? _positionSeconds;

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

  Future<void> _loadAudio() async {
    _audio = await Audio.load('assets/audio/sample.mp3',
        onDuration: (double durationSeconds) =>
            setState(() => _durationSeconds = durationSeconds),
        onPosition: (double positionSeconds) =>
            setState(() => _positionSeconds = positionSeconds),
        onComplete: () => setState(() => _isPlaying = false));
  }

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

  void _playPause() {
    if (_isPlaying) {
      _audio.pause();
    } else {
      _audio.play();
    }
    setState(() => _isPlaying = !_isPlaying);
  }

  String? _formatTime(double? seconds) {
    if (seconds == null) return null;
    final int minutes = (seconds ~/ 60).toInt();
    final int secs = (seconds % 60).toInt();
    return '$minutes:${secs.toString().padLeft(2, '0')}';
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Audio Player Example')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            ElevatedButton(
              onPressed: _playPause,
              child: Text(_isPlaying ? 'Pause' : 'Play'),
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                Text(_formatTime(_positionSeconds) ?? '0:00'),
                Text(_formatTime(_durationSeconds) ?? '0:00'),
              ],
            ),
            Slider(
              value: _positionSeconds != null && _durationSeconds != null
                  ? _positionSeconds! / _durationSeconds!
                  : 0.0,
              onChanged: (double val) {
                if (_durationSeconds != null) {
                  _audio.seek(val * _durationSeconds!);
                }
              },
            ),
          ],
        ),
      ),
    );
  }
}

后台音频播放设置

为了使音频在应用最小化时继续播放,你需要对iOS和Android平台进行一些额外配置。

iOS

  1. 打开Xcode并启用 “audio” 背景模式能力。
  2. 或者,在 Info.plist 文件中添加以下内容:
<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
</array>

Android

  1. AndroidManifest.xml 文件中添加以下权限:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
  1. <application> 标签内添加以下服务声明:
<service android:name="com.google.flutter.plugins.audiofileplayer.AudiofileplayerService"
    android:foregroundServiceType="mediaPlayback">
    <intent-filter>
        <action android:name="android.media.browse.MediaBrowserService" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</service>

<receiver android:name="androidx.media.session.MediaButtonReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>
  1. 如果需要自定义通知图标,可以在 res/drawable-{density} 目录下添加适当尺寸的图标,并在 AndroidManifest.xml 中指定:
<meta-data android:name="ic_audiofileplayer" android:value="drawable/notification_icon" />

通过以上步骤,你就可以在Flutter项目中使用 audiofileplayer 插件实现音频播放功能了。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用audiofileplayer插件来播放音频文件的示例代码。audiofileplayer是一个流行的Flutter插件,用于播放本地或网络上的音频文件。

首先,确保你已经在pubspec.yaml文件中添加了audiofileplayer依赖:

dependencies:
  flutter:
    sdk: flutter
  audiofileplayer: ^0.18.0  # 请检查最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤使用audiofileplayer插件:

  1. 导入包
import 'package:flutter/material.dart';
import 'package:audiofileplayer/audiofileplayer.dart';
  1. 定义AudioFilePlayer实例

在你的State类中,定义一个AudioFilePlayer实例:

class _MyHomePageState extends State<MyHomePage> {
  AudioFilePlayer? audioPlayer;
  String audioUrl = 'path/to/your/audio/file.mp3'; // 可以是本地路径或网络URL

  @override
  void initState() {
    super.initState();
    audioPlayer = AudioFilePlayer();
    _loadAudio();
  }

  void _loadAudio() async {
    await audioPlayer!.open(Audio.network(audioUrl)); // 如果是本地文件,使用Audio.file(File('path/to/file'))
    setState(() {});
  }

  @override
  void dispose() {
    audioPlayer?.dispose();
    super.dispose();
  }
  1. 创建播放控件

在你的UI中,添加播放、暂停和停止按钮:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('AudioFilePlayer Example'),
    ),
    body: Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          ElevatedButton(
            onPressed: audioPlayer!.value.isPlaying
                ? () => audioPlayer!.pause()
                : () async {
                    if (!audioPlayer!.value.isInitialized) {
                      await _loadAudio();
                    }
                    await audioPlayer!.play();
                  },
            child: Text(audioPlayer!.value.isPlaying ? 'Pause' : 'Play'),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () => audioPlayer!.stop(),
            child: Text('Stop'),
          ),
        ],
      ),
    ),
  );
}
  1. 处理播放状态

你可以监听音频播放器的状态,以便更新UI或执行其他操作。例如,显示播放时间、进度条等。以下是一个简单的示例,显示当前播放状态:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('AudioFilePlayer Example'),
    ),
    body: Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text(
            '${audioPlayer!.value.position.inMilliseconds.toStringAsFixed(2)} ms / ${audioPlayer!.value.duration?.inMilliseconds ?? 0} ms',
            style: TextStyle(fontSize: 18),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: audioPlayer!.value.isPlaying
                ? () => audioPlayer!.pause()
                : () async {
                    if (!audioPlayer!.value.isInitialized) {
                      await _loadAudio();
                    }
                    await audioPlayer!.play();
                  },
            child: Text(audioPlayer!.value.isPlaying ? 'Pause' : 'Play'),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () => audioPlayer!.stop(),
            child: Text('Stop'),
          ),
        ],
      ),
    ),
  );
}

以上代码展示了如何在Flutter项目中使用audiofileplayer插件来播放音频文件,并提供了播放、暂停和停止的功能,同时还显示了当前播放时间和总时长。

请确保根据你的实际需求调整音频文件的路径和UI布局。

回到顶部