1

我的实现在前台循环。它也可以在后台运行。问题是它不会在后台循环。该问题仅发生在 iOS 物理设备上(不在模拟器或 Android 上)。

我正在使用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)?

4

2 回答 2

0

就我而言,它适用于 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)
于 2022-01-13T05:25:34.880 回答
0

我不是 的专家audioplayers,但您可以尝试添加覆盖

@override
  Future<void> setRepeatMode(AudioServiceRepeatMode repeatMode) async {
    var releaseMode = ReleaseMode.LOOP;
    switch(repeatMode) {
       ...
       // update releaseMode here
    }
    await _player.setReleaseMode(releaseMode);
}

但我怀疑这会解决问题。

于 2021-12-17T13:56:05.837 回答