Flutter音频处理插件audio_plus的使用

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

Flutter音频处理插件audio_plus的使用

audio_plus

audio_plus 是一个用于在Flutter应用程序中播放音频文件和URL的全面包。该包提供了一个平台无关的接口,可以在不同平台(iOS、Android)上执行基本操作,如播放、暂停、恢复、循环和停止音频文件和URL。此外,它还包含高级功能,以增强音频控制和定制音频体验。

目录

特性

  • 音频控制:播放、暂停、恢复、停止音频文件和URL。
  • 音量调整:根据需要增加或减少音量。
  • 定位位置:跳转到音频文件中的特定位置。
  • 播放状态跟踪:跟踪音频是否正在播放。
  • 时长和位置信息:获取当前播放位置和总时长。
  • 循环:循环播放音频文件。

截图

安装

要将 audio_plus 包添加到您的项目中,请在 pubspec.yaml 文件的依赖项部分包含以下行:

dependencies:
  audio_plus: ^1.0.3

在终端中运行以下命令以更新您的包依赖项:

flutter pub get

使用

以下是一些基本的使用示例:

import 'package:audio_plus/audio_plus.dart';

// 播放音频文件
await AudioPlus.play('assets/audio/beethoven.mp3');

// 播放音频URL
await AudioPlus.playUrl('https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3');

// 暂停播放
await AudioPlus.pause();

// 恢复播放
await AudioPlus.resume();

// 停止播放
await AudioPlus.stop();

// 增加音量
await AudioPlus.increaseVolume(0.8);

// 跳转到特定位置
await AudioPlus.seekTo(5000);

// 循环播放音频文件
await AudioPlus.isLooping(true);

// 检查音频是否正在播放
bool? playing = await AudioPlus.isPlaying;

// 获取当前播放位置
double? currentPosition = await AudioPlus.currentPosition;

// 获取音频的总时长
double? duration = await AudioPlus.duration;

example 文件夹中,您会找到一个演示如何使用 audio_plus 包的示例应用程序。此示例应用创建了一个音频播放器界面并执行基本的音频控制操作。

Dart版本

  sdk: '>=2.17.0 <4.0.0'

问题

请在 GitHub 页面上提交任何问题、错误或功能请求。

贡献

如果您想为插件做出贡献(例如改进文档、解决错误或添加新的功能),请仔细阅读我们的 贡献指南 并发送您的 拉取请求

作者

audio_plus 插件由 Bedirhan Sağlam 开发。您可以联系我:bedirhansaglam270@gmail.com

许可

MIT

示例代码

以下是 audio_plus 的一个完整示例代码,展示了一个简单的音频播放器界面:

import 'dart:async';
import 'dart:io';

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: AudioPlayerScreen(),
    );
  }
}

class AudioPlayerScreen extends StatefulWidget {
  const AudioPlayerScreen({super.key});

  @override
  State<AudioPlayerScreen> createState() => _AudioPlayerScreenState();
}

class _AudioPlayerScreenState extends State<AudioPlayerScreen> {
  final StreamController<double> _positionStreamController = StreamController<double>();
  bool isPlaying = false;
  bool isLooping = false;
  double currentPosition = 0;
  double maxDuration = 0;
  double volume = 1.0;
  Timer? _timer;

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

  Future<void> _initializeAudio() async {
    maxDuration = await AudioPlus.duration ?? 0;
    setState(() {});
  }

  @override
  void dispose() {
    _timer?.cancel();
    _positionStreamController.close();
    super.dispose();
  }

  Future<void> _play() async {
    await AudioPlus.play('assets/audio/beethoven.mp3');
    // 或者使用URL: await AudioPlus.playUrl('https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3');
    maxDuration = await AudioPlus.duration ?? 0;
    currentPosition = await AudioPlus.currentPosition ?? 0;
    _startPositionStream();
    setState(() {
      isPlaying = true;
    });
  }

  Future<void> _stop() async {
    await AudioPlus.stop();
    setState(() {
      isPlaying = false;
      currentPosition = 0.0;
    });
  }

  Future<void> _startPositionStream() async {
    _timer = Timer.periodic(const Duration(seconds: 1), (_) async {
      try {
        currentPosition = await AudioPlus.currentPosition ?? 0;
        _positionStreamController.add(currentPosition);
        bool? playing = await AudioPlus.isPlaying;
        setState(() {
          isPlaying = playing ?? false;
        });
      } catch (e) {
        _positionStreamController.addError(e);
      }
    });
  }

  Future<void> _pause() async {
    await AudioPlus.pause();
    setState(() {
      isPlaying = false;
    });
  }

  Future<void> _resume() async {
    await AudioPlus.resume();
    setState(() {
      isPlaying = true;
    });
  }

  Future<void> _seekTo(double value) async {
    await AudioPlus.seekTo(((Platform.isAndroid ? value * 1000 : value).toInt()));
    setState(() {
      currentPosition = value;
    });
  }

  Future<void> _changeVolume(double value) async {
    await AudioPlus.increaseVolume(value);
    setState(() {
      volume = value;
    });
  }

  Future<void> _setReplay() async {
    isLooping = !isLooping;
    await AudioPlus.isLooping(isLooping);
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      appBar: AppBar(
        title: const Text('Audio Player'),
        backgroundColor: Colors.black,
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const SizedBox(height: 20),
            const Text(
              'Beethoven Symphony No. 5',
              style: TextStyle(color: Colors.white, fontSize: 18),
            ),
            const SizedBox(height: 20),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                Padding(
                  padding: const EdgeInsets.symmetric(horizontal: 16),
                  child: StreamBuilder<double>(
                    stream: _positionStreamController.stream,
                    builder: (context, snapshot) {
                      return Text(
                        (snapshot.data ?? 0).toStringAsFixed(2),
                        style: const TextStyle(color: Colors.white54),
                      );
                    },
                  ),
                ),
                Expanded(
                  child: Slider(
                    value: currentPosition,
                    min: 0.0,
                    max: maxDuration,
                    activeColor: Colors.green,
                    inactiveColor: Colors.white54,
                    onChanged: _seekTo,
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.symmetric(horizontal: 16),
                  child: Text(
                    maxDuration.toStringAsFixed(2),
                    style: const TextStyle(color: Colors.white54),
                  ),
                ),
              ],
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                IconButton(
                  icon: Icon(
                    isPlaying
                        ? Icons.pause_circle_filled
                        : Icons.play_circle_filled,
                    color: Colors.white,
                    size: 56,
                  ),
                  onPressed: isPlaying
                      ? _pause
                      : currentPosition > 0
                          ? _resume
                          : () => _play,
                ),
                if (currentPosition > 0)
                  IconButton(
                    icon: const Icon(
                      Icons.stop_circle_outlined,
                      color: Colors.red,
                      size: 56,
                    ),
                    onPressed: _stop,
                  ),
                IconButton(
                  icon: Icon(
                    isLooping ? Icons.repeat_one : Icons.repeat,
                    color: isLooping ? Colors.green : Colors.white,
                    size: 56,
                  ),
                  onPressed: _setReplay,
                ),
              ],
            ),
            Slider(
              value: volume,
              min: 0.0,
              max: 1.0,
              activeColor: Colors.green,
              inactiveColor: Colors.white54,
              onChanged: _changeVolume,
            ),
          ],
        ),
      ),
    );
  }
}

此示例代码创建了一个简单的音频播放器界面,包括播放、暂停、停止、跳转、循环和调整音量的功能。希望这对您有所帮助!


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

1 回复

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


当然,以下是一个关于如何使用Flutter音频处理插件audio_plus的代码示例。audio_plus是一个功能强大的音频插件,可以用于播放、暂停、停止音频,以及获取音频的状态信息。

首先,你需要在你的pubspec.yaml文件中添加audio_plus依赖:

dependencies:
  flutter:
    sdk: flutter
  audio_plus: ^0.15.0  # 请检查最新版本号

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

接下来是一个简单的示例,展示如何使用audio_plus播放一个音频文件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: 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();
    _audioPlayer.setVolume(1.0);
  }

  @override
  void dispose() {
    // 释放资源
    _audioPlayer.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Plus Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                // 播放音频文件
                final String audioUrl = 'assets/audio/sample.mp3'; // 确保你有这个音频文件在assets文件夹下
                await _audioPlayer.play(audioUrl);
              },
              child: Text('Play Audio'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // 暂停音频
                if (_audioPlayer.playing) {
                  await _audioPlayer.pause();
                }
              },
              child: Text('Pause Audio'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // 停止音频
                await _audioPlayer.stop();
              },
              child: Text('Stop Audio'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // 获取音频状态
                final AudioPlayerState state = await _audioPlayer.playerState;
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Current State: $state')),
                );
              },
              child: Text('Get Audio State'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 初始化AudioPlayer:在initState方法中初始化AudioPlayer实例。
  2. 播放音频:使用_audioPlayer.play(audioUrl)方法播放音频文件。
  3. 暂停音频:使用_audioPlayer.pause()方法暂停当前播放的音频。
  4. 停止音频:使用_audioPlayer.stop()方法停止当前播放的音频。
  5. 获取音频状态:使用_audioPlayer.playerState方法获取当前音频的状态,并通过SnackBar显示状态信息。

注意:

  • 你需要在assets文件夹下有一个名为audio的文件夹,并在其中放置一个名为sample.mp3的音频文件。同时,你需要在pubspec.yaml文件中声明这些资源:
flutter:
  assets:
    - assets/audio/sample.mp3

这个示例展示了audio_plus插件的基本使用方法,你可以根据需要进行扩展和修改。

回到顶部