如何在flutter中处理多个AudioPlayer

问题描述 投票:0回答:1

我正在构建一个聊天应用程序,我需要构建与聊天中一样多的音频播放器。我尝试使用

just_audio
audio_waveforms
但它们都没有帮助我。使用 just_audio,我无法控制多个音频播放器,我的方法是,对于每个音频消息,我将在地图中创建一个带有 id 的音频播放器。这样我就可以控制每个音频播放器,但库本身存在一些问题,所以我放弃使用它。
audio_waveforms
,它在
assets/audio/1.wav
中根本找不到我的音频。我也尝试过像这样使用 path_provider :

final directory = await getApplicationDocumentsDirectory();
      await player.preparePlayer(
        path: '${directory.path}/$path',
        shouldExtractWaveform: true,
        noOfSamples: 100,
      );

但同样的问题。在该领域有经验的人可以告诉我同时播放多个音频播放器NOT的最佳方法是什么以及他为此使用的包或代码。

编辑

我尝试将文件夹放在与文件相同的文件夹中,它没有给我错误,但它不起作用,它只是给了我一条垂直线

flutter audio audio-player
1个回答
0
投票

这是从

multiple sounds
播放
ListView
的示例代码。

首先,从这里下载我的资源。

这会将这样的行添加到您的包的

pubspec.yaml
中(并运行隐式 flutter pub get):

dependencies:
  just_audio: ^0.9.35

此外,在

pubspec.yaml
文件中,进行以下配置:

flutter:
  uses-material-design: true
  assets:
    - assets/sound1.mp3
    - assets/sound2.mp3
    - assets/sound3.mp3
    - assets/sound4.mp3
    - assets/sound5.mp3

将这些代码复制并粘贴到

main.dart
文件中:

import "package:flutter/material.dart";
import "package:just_audio/just_audio.dart";

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

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

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

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

  @override
  State<MyWidget> createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  int playIndex = -1;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: ListView.builder(
          itemCount: 5,
          itemBuilder: (BuildContext context, int index) {
            return ListTile(
              dense: true,
              leading: const Icon(Icons.music_note),
              title: Text("Sound ${index + 1}"),
              subtitle: Text("Tap to play sound ${index + 1}"),
              trailing: Icon(
                playIndex == index ? Icons.stop_circle : Icons.play_circle,
              ),
              onTap: () async {
                if (playIndex == index) {
                  await MyAudioService.instance.stop();
                  playIndex = -1;
                  setState(() {});
                } else {
                  final String soundPath = "assets/sound${index + 1}.mp3";
                  await MyAudioService.instance.play(
                    path: soundPath,
                    startedPlaying: () {
                      playIndex = index;
                      setState(() {});
                    },
                    stoppedPlaying: () {
                      playIndex = -1;
                      setState(() {});
                    },
                  );
                }
              },
            );
          },
        ),
      ),
    );
  }
}

class MyAudioService {
  MyAudioService._();
  static final MyAudioService instance = MyAudioService._();

  final AudioPlayer player = AudioPlayer();

  Future<void> play({
    required String path,
    required Function() startedPlaying,
    required Function() stoppedPlaying,
  }) async {
    await stop();
    await player.setAsset(path);
    startedPlaying();
    await player.play();
    await player.stop();
    stoppedPlaying();
    return Future<void>.value();
  }

  Future<void> stop() async {
    if (player.playing) {
      await player.stop();
    } else {}
    return Future<void>.value();
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.