我的实现在前台循环。它也在后台工作。问题是它不会在后台循环。该问题仅发生在iOS物理设备上(模拟器和安卓系统都没有(。
我使用https://pub.dev/packages/audioplayers
插件,因为https://pub.dev/packages/just_audio
给我带来了各种各样的麻烦,尤其是在音频缓存做得不好的情况下,它最终总是使曲目开头的每个音频延迟,这对我来说是不可能的。
这是我的audio_player_handler.dart
文件:
import 'package:ambee2/models/animations/light_animation.dart';
import 'package:audio_service/audio_service.dart';
import 'package:flutter/material.dart';
// import 'package:just_audio/just_audio.dart';
import 'package:audioplayers/audioplayers.dart';
class AudioPlayerHandler extends BaseAudioHandler {
final _player = AudioPlayer();
AudioPlayerHandler() {
//set the audio to repeat itself once it's done
_player.setReleaseMode(ReleaseMode.LOOP);
}
Future<void> setUrl(String url) async => await _player.setUrl(url);
Future<void> playUrl(String url, double volumeValue) => _player.play(url, volume: volumeValue);
Future<void> resume() => _player.resume();
@override
Future<void> pause() => _player.pause();
@override
Future<void> stop() => _player.stop();
Future<void> setVolume(double newValue) => _player.setVolume(newValue);
}
我还有一个名为:LightAnimation
的对象,它的属性audioHandler定义如下:
class LightAnimation {
AudioPlayerHandler audioHandler = AudioPlayerHandler();
LightAnimation({
this.audioUrl,
});
}
然后我只从我的代码库的不同部分访问,如下所示:
await lightAnimation.audioHandler.playUrl(lightAnimation.audioUrl, volumeSetValue);
我的实现是错误的还是只是程序包方面的错误(https://pub.dev/packages/audioplayers)?
在我的案例中,它在IOS后台物理设备中工作。我遵循了Suragch的本教程。查看他的final
回购。
在audio_handler.dart
中
@override
Future<void> setRepeatMode(AudioServiceRepeatMode repeatMode) async {
switch (repeatMode) {
case AudioServiceRepeatMode.none:
_player.setLoopMode(LoopMode.off);
break;
case AudioServiceRepeatMode.one:
_player.setLoopMode(LoopMode.one);
break;
case AudioServiceRepeatMode.group:
case AudioServiceRepeatMode.all:
_player.setLoopMode(LoopMode.all);
break;
}
}
在page_manager.dart
中
void repeat() {
repeatButtonNotifier.nextState();
final repeatMode = repeatButtonNotifier.value;
switch (repeatMode) {
case RepeatState.off:
_audioHandler.setRepeatMode(AudioServiceRepeatMode.none);
break;
case RepeatState.repeatSong:
_audioHandler.setRepeatMode(AudioServiceRepeatMode.one);
break;
case RepeatState.repeatPlaylist:
_audioHandler.setRepeatMode(AudioServiceRepeatMode.all);
break;
}
您可以根据需要自定义repeat((。
_audioHandler.setRepeatMode(AudioServiceRepeatMode.one)
我不是audioplayers
的专家,但您可以尝试添加覆盖
@override
Future<void> setRepeatMode(AudioServiceRepeatMode repeatMode) async {
var releaseMode = ReleaseMode.LOOP;
switch(repeatMode) {
...
// update releaseMode here
}
await _player.setReleaseMode(releaseMode);
}
但我怀疑这是否能解决问题。