AVE*_*imi 4 queue audio flutter just-audio
我正在使用 flutter audio_service ( https://pub.dev/packages/audio_service ) 和 just_audio ( https://pub.dev/packages/just_audio ) 在前台和后台播放音频文件。
我对BackgroundAudioTask进行了子类化,添加了 AudioPlayer 的实例,并重写了所需的方法。例如我更新了重复模式:
@override
Future<void> onSetRepeatMode(AudioServiceRepeatMode repeatMode) async {
super.onSetRepeatMode(repeatMode);
switch (repeatMode)
{
case AudioServiceRepeatMode.all:
_audioPlayer.setLoopMode(LoopMode.all);
break;
case AudioServiceRepeatMode.none:
_audioPlayer.setLoopMode(LoopMode.off);
break;
case AudioServiceRepeatMode.one:
_audioPlayer.setLoopMode(LoopMode.one);
break;
case AudioServiceRepeatMode.group:
_audioPlayer.setLoopMode(LoopMode.all);
break;
}
}
@override
Future<void> onPlayFromMediaId(String mediaId) async {
await _audioPlayer.stop();
// Get queue index by mediaId.
_queueIndex = _queue.indexWhere((test) => test.id == mediaId);
// Set url source to _audioPlayer.
downloadAndPlay(_mediaItem);
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试添加播放列表并循环播放音频文件,但似乎缺少某些内容,并且在播放第 1 首曲目后,播放器会尝试从相同的第 1 首曲目开始并再次播放。这是我的代码(downloadAndPlay的一部分):
var list=List<AudioSource>();
for (int t=0;t<_queue.length;t++)
{
var mi=_queue[t];
var url = mi.extras['source'];
list.add(AudioSource.uri(Uri.parse(url)));
}
D("Loading list with ${list.length} items");
D("Seeking to index : $_queueIndex");
await _audioPlayer.load(ConcatenatingAudioSource(children: list),
initialIndex: _queueIndex, initialPosition: Duration.zero);
AudioService.updateQueue(_queue);
AudioService.setRepeatMode(AudioServiceRepeatMode.all);
_audioPlayer.play();
Run Code Online (Sandbox Code Playgroud)
我添加这个来检查ProcessingState.completed是否触发,这意味着它到达了轨道的末尾,但它没有触发:
playerEventSubscription = _audioPlayer.playbackEventStream.listen((event) {
D("audioPlayerTask: playbackEventStream : ${event.processingState}");
switch (event.processingState) {
case ProcessingState.ready:
_setState(state: AudioProcessingState.ready);
break;
case ProcessingState.buffering:
_setState(state: AudioProcessingState.buffering);
break;
case ProcessingState.completed:
_handlePlaybackCompleted();
break;
default:
break;
}
});
Run Code Online (Sandbox Code Playgroud)
您应该从BackgroundAudioTask子类内部重写该onSetRepeatMode方法。
import 'package:audio_service/audio_service.dart';
import 'package:just_audio/just_audio.dart';
class AudioPlayerTask extends BackgroundAudioTask {
AudioPlayer _player = new AudioPlayer();
...
@override
Future<void> onSetRepeatMode(AudioServiceRepeatMode repeatMode) async {
switch (repeatMode) {
case AudioServiceRepeatMode.none:
await _player.setLoopMode(LoopMode.off);
break;
case AudioServiceRepeatMode.one:
await _player.setLoopMode(LoopMode.one);
break;
case AudioServiceRepeatMode.all:
case AudioServiceRepeatMode.group:
await _player.setLoopMode(LoopMode.all);
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个特定的实现使用just_audio作为音频播放器。请注意,这AudioPlayerTask是 just_audioAudioPlayer出现的唯一类。它不应该出现在应用程序的任何其他类中。在其他地方,您将使用audio_service的AudioService类。
例如,当用户按下按钮时,您可以运行以下代码行:
AudioService.setRepeatMode(AudioServiceRepeatMode.none);
Run Code Online (Sandbox Code Playgroud)
这将通知系统并让BackgroundAudioTask运行,onSetRepeatMode以便内部AudioPlayer类可以做它的事情。
| 归档时间: |
|
| 查看次数: |
3960 次 |
| 最近记录: |