Flutter音频处理插件sound_library的使用

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

Flutter音频处理插件sound_library的使用

sound_library 是一个简单且免费的UI音效库,适用于Flutter应用中的各种通用目的。本文将详细介绍如何在Flutter项目中集成和使用这个插件。

特性

  • 提供多种常见的UI音效,如点击、打开、删除等。
  • 支持从URL、文件路径、资产路径等多种方式播放声音。

开始使用

添加依赖

在你的Flutter项目的pubspec.yaml文件中添加以下依赖:

dependencies:
  ...
  sound_library: ^1.0.0

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

导入包

在你的Dart代码中导入sound_library包:

import 'package:sound_library/sound_library.dart';  

可用音效

以下是部分可用的音效列表:

名称 描述
Click 一般按钮点击音效
Action 一般操作音效
Open 打开抽屉、菜单、弹窗等音效
Deleted 删除项、删除文件等音效
Welcome 欢迎音效
Success 成功或完成动作音效

更多音效可以参考官方文档或示例项目。

使用示例

播放音效

基本播放

播放一个默认音量和位置的音效:

SoundPlayer.play(Sounds.click);

播放一个指定音量和位置的音效:

SoundPlayer.play(Sounds.click, volume: 0.5, position: Duration(milliseconds: 500));

从不同来源播放

从URL播放音效:

SoundPlayer.playFromUrl('https://example.com/sound.mp3');

从文件路径播放音效:

SoundPlayer.playFromDeviceFilePath('/path/to/sound/file.mp3');

从资产路径播放音效:

SoundPlayer.playFromAssetPath('assets/sounds/click.mp3');

从字节数据播放音效:

List<int> bytes = [...]; // Your byte data
SoundPlayer.playFromBytes(bytes);

音效控制

检查当前音效是否启用:

bool enabled = SoundPlayer.isAudioEnabled;

从设备存储加载音效启用状态:

bool enabled = await SoundPlayer.checkLocalStorageEnabled();

启用或禁用音效,并保存到设备存储:

SoundPlayer.setAudioEnabled(true); // 或 false

示例Demo

以下是一个完整的示例项目,展示如何使用sound_library来创建一个简单的音效播放器界面:

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Sound Library',
      theme: ThemeData(
        primarySwatch: Colors.blueGrey,
      ),
      home: const MyHomePage(),
    );
  }
}

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

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

class _MyHomePageState extends State<MyHomePage> {
  final int blockLength = 5;
  List<Widget> soundsList = [];

  @override
  void initState() {
    soundsList = [
      buildSoundButton('Click', Sounds.click, icon: Icon(Icons.input, color: Colors.blue[800], size: 30)),
      buildSoundButton('Welcome', Sounds.welcome, icon: Icon(Icons.home, color: Colors.blue[800], size: 30)),
      buildSoundButton('Open', Sounds.open, icon: const Icon(Icons.door_back_door_outlined, color: Colors.black, size: 30)),
      buildSoundButton('Close (Wood hit)', Sounds.woodHit, icon: Icon(Icons.emoji_objects, color: Colors.brown[800], size: 30)),
      buildSoundButton('Order Complete', Sounds.orderComplete, icon: Icon(Icons.check, color: Colors.green[800], size: 30)),
      buildSoundButton('Deleted', Sounds.deleted, icon: Icon(Icons.delete, color: Colors.red[800], size: 30)),
      buildSoundButton('Add to cart', Sounds.addToCart, icon: Icon(Icons.add_shopping_cart, color: Colors.amber[800], size: 30)),
      buildSoundButton('Success', Sounds.success, icon: Icon(Icons.check_circle, color: Colors.green[800], size: 30)),
      buildSoundButton('Cashing Machine', Sounds.cashingMachine, icon: Icon(Icons.monetization_on, color: Colors.yellow[800], size: 30)),
      buildSoundButton('Action', Sounds.action, icon: Icon(Icons.add_circle, color: Colors.blue[800], size: 30)),
    ];
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: const Color(0xFFc1c1c1),
      appBar: AppBar(
        backgroundColor: const Color(0xFF0E0E43),
        title: const Text("Sound Library", style: TextStyle(color: Colors.white)),
      ),
      body: ListView(
        children: [
          Wrap(
            alignment: WrapAlignment.center,
            runAlignment: WrapAlignment.center,
            children: [
              for (var i = 0; i < soundsList.length; i += blockLength)
                Column(
                  children: [
                    for (var j = i; j < i + blockLength; j++) soundsList.length > j ? soundsList[j] : const SizedBox(),
                  ],
                ),
            ],
          ),
        ],
      ),
      floatingActionButton: const Text('By MIS Develop'),
    );
  }

  Widget buildSoundButton(String name, Sounds sound, {Icon? icon}) => Padding(
        padding: const EdgeInsets.all(8.0),
        child: FittedBox(
          fit: BoxFit.scaleDown,
          child: SizedBox(
            width: 200,
            child: Card(
              child: TextButton(
                child: Row(
                  mainAxisSize: MainAxisSize.min,
                  children: [
                    Text(name),
                    const Spacer(),
                    icon ?? const SizedBox(),
                  ],
                ),
                onPressed: () {
                  SoundPlayer.play(sound);
                },
              ),
            ),
          ),
        ),
      );
}

通过以上步骤和示例代码,你可以轻松地在Flutter应用中集成并使用sound_library插件来播放各种音效。希望这些信息对你有所帮助!


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

1 回复

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


当然,以下是一个关于如何使用Flutter音频处理插件sound_library(假设这个插件提供类似功能,因为实际上并没有一个广泛认可的名为sound_library的Flutter插件,这里以常见的音频处理功能为例,如播放、暂停、停止音频等)的示例代码。请注意,实际使用时,你需要根据所选插件的API文档进行调整。

假设我们有一个名为audio_service的插件(这是实际存在的一个插件,用于音频处理,这里仅作为示例),以下是如何在Flutter项目中使用它进行基本的音频处理的示例代码。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  audio_service: ^0.18.3  # 请检查最新版本号
  just_audio: ^0.9.19      # audio_service依赖于just_audio进行音频播放

2. 配置音频服务

创建一个文件audio_handler.dart来配置音频服务:

import 'package:audio_service/audio_service.dart';
import 'package:just_audio/just_audio.dart';

class AudioHandler extends BaseAudioHandler {
  final AudioPlayer _player = AudioPlayer();

  AudioHandler() {
    _player.setUpPlaybackFromMediaItem(
      MediaItem(
        id: 'unique-id',
        title: 'Sample Title',
        album: 'Sample Album',
        artist: 'Sample Artist',
        duration: const Duration(seconds: 60), // 示例时长
        extras: <String, dynamic>{'uri': 'path/to/your/audio/file.mp3'},
      ),
    );
  }

  @override
  Future<void> play() async => await _player.play();

  @override
  Future<void> pause() async => await _player.pause();

  @override
  Future<void> stop() async => await _player.stop();

  @override
  Future<void> seek(Duration position) async => await _player.seek(position);

  @override
  Duration get position => _player.position;
}

3. 启动音频服务

在你的主文件main.dart中启动音频服务:

import 'package:flutter/material.dart';
import 'package:audio_service/audio_service.dart';
import 'audio_handler.dart';

void main() {
  AudioService.init(
    builder: () => AudioHandler()..play(),
  );
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Audio Service Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () => AudioService.play(),
                child: Text('Play'),
              ),
              ElevatedButton(
                onPressed: () => AudioService.pause(),
                child: Text('Pause'),
              ),
              ElevatedButton(
                onPressed: () => AudioService.stop(),
                child: Text('Stop'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

4. 处理音频事件(可选)

你可以通过监听音频服务的事件来更新UI或执行其他操作。例如,监听播放状态变化:

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  AudioServiceState? _audioServiceState;

  @override
  void initState() {
    super.initState();
    AudioService.playbackStateStream.listen((state) {
      setState(() {
        _audioServiceState = state;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Audio Service Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              if (_audioServiceState?.playing ?? false)
                ElevatedButton(
                  onPressed: () => AudioService.pause(),
                  child: Text('Pause'),
                )
              else
                ElevatedButton(
                  onPressed: () => AudioService.play(),
                  child: Text('Play'),
                ),
              ElevatedButton(
                onPressed: () => AudioService.stop(),
                child: Text('Stop'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意

  • audio_servicejust_audio是两个常用的Flutter音频处理插件,但具体功能和使用方法可能有所不同。
  • 请查阅所选插件的官方文档以获取最新和最准确的信息。
  • 上面的代码示例是基于audio_service插件的API编写的,实际使用时可能需要根据插件版本和API变化进行调整。
回到顶部