【问题标题】:Audio not looping in the background音频不在后台循环播放
【发布时间】:2022-01-10 11:10:50
【问题描述】:

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

这是我的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)?

【问题讨论】:

  • 所以你的问题是它是audio_service还是audioplayers的错误?您已经报告了有关 audio_service 的错误,并且作者确认这不是 audio_service 错误。您可能需要相应地更新您的问题,以将其作为一个专门针对音频播放器的问题。
  • Ryan,如果您确定,我的问题在于我的实施,请您好心告诉我和其他人我的实施有什么问题。或者更好的是,如何正确地做到这一点——如何正确地设置后台循环。无论如何,这应该是一个很好的迹象,文档中缺少有关它的部分内容。
  • @TomasBaran,如果您在 just_audio_background 插件 (pub.dev/packages/just_audio_background) 中运行示例,该插件在后台使用 just_audioaudio_service,您会注意到重复模式确实有效在后台的 iOS 设备上。所以问题在于您的实现(未在您发布的代码中显示)或audioplayers
  • @AhmedRaza 谢谢!我看过这篇文章,但是它已经过时了。它使用了许多不再适用的已弃用的东西。最重要的是,它讨论了如何实现我已经拥有的背景并且效果很好。什么不工作是在文章中根本没有解决的背景循环。

标签: flutter flutter-plugin audio-service


【解决方案1】:

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

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

但我怀疑这会解决问题。

【讨论】:

  • 谢谢,但我之前已经尝试过基本相同的解决方案。没有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2015-05-27
相关资源
最近更新 更多