我正在构建一个聊天应用程序,我需要构建与聊天中一样多的音频播放器。我尝试使用
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的最佳方法是什么以及他为此使用的包或代码。
编辑
我尝试将文件夹放在与文件相同的文件夹中,它没有给我错误,但它不起作用,它只是给了我一条垂直线
这是从
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();
}
}