首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AudioPlayers和Future.wait同时播放声音效果列表时颤振崩溃

使用AudioPlayers和Future.wait同时播放声音效果列表时颤振崩溃
EN

Stack Overflow用户
提问于 2022-11-19 08:12:20
回答 1查看 15关注 0票数 0

我想创建一个表示执行声音效果的List<Future<void>>列表。

因此,我迭代了一个事件类型/格式的列表(即。(“剑”)和映射每一个音效播放执行。

我用随机数的毫秒(从30到100毫秒)将这些未来封装在一个Future.delayed中,只是为了在播放声音效果时有一个小的随机出现(在两个声音效果之间添加一个暂停)。

这些声音效果期货的列表然后由Future.wait调用,我期望这个列表将被解决,Future.delay可能会生效。

这是我的密码

代码语言:javascript
复制
 _playActionEventSounds() async {
    if (widget.log.isNotEmpty) {
      final lastRound = widget.log.map((e) => e.round).reduce(max);
      final lastActionEvents = widget.log.where((actionEvent) => actionEvent.round == lastRound);
      final List<Future<void>> eventSounds = lastActionEvents.map((actionEvent) async {
        if (actionEvent.format == "sword") {
          return Future.delayed(Duration(milliseconds: next(30, 100)), () => _soundPlayer.punch());
        }
        if (actionEvent.format == "damage") {
          return Future.delayed(Duration(milliseconds: next(30, 100)), () => _soundPlayer.pain());
        }
        return Future.value(null);
      }).toList();

      await Future.wait(eventSounds);
    }
  }

SoundPlayer类:

代码语言:javascript
复制
import 'package:audioplayers/audioplayers.dart';

class SoundPlayer {
  Future<void> punch() async {
    final player = AudioPlayer();
    player.setReleaseMode(ReleaseMode.stop);
    return await player.play(AssetSource("sounds/punch.wav"));
  }

  Future<void> pain() async {
    final player = AudioPlayer();
    player.setReleaseMode(ReleaseMode.stop);
    return await player.play(AssetSource("sounds/pain.wav"));
  }
}

我现在可以多次运行这个过程了。我确实听到声音像预期的那样出现了。但是在第四次执行之后,应用程序就崩溃了。

这是一个错误:

代码语言:javascript
复制
I/flutter (28346): Unexpected platform error: MediaPlayer error with what:MEDIA_ERROR_UNKNOWN {what:1} extra:MEDIA_ERROR_UNKNOWN {extra:-19}
E/MediaPlayerNative(28346): pause called in state 0, mPlayer(0xb400007a92646810)
E/MediaPlayerNative(28346): error (-38, 0)
E/MediaPlayerNative(28346): Attempt to call getDuration in wrong state: mPlayer=0xb400007a92646810, mCurrentState=0
E/MediaPlayerNative(28346): error (-38, 0)
E/MediaPlayerNative(28346): stop called in state 0, mPlayer(0xb400007a92646810)
E/MediaPlayerNative(28346): error (-38, 0)
E/MediaPlayerNative(28346): prepareAsync called in state 0, mPlayer(0xb400007a92646810)
D/AndroidRuntime(28346): Shutting down VM
E/AndroidRuntime(28346): FATAL EXCEPTION: main
E/AndroidRuntime(28346): Process: com.example.app, PID: 28346
E/AndroidRuntime(28346): java.lang.IllegalStateException
E/AndroidRuntime(28346):    at android.media.MediaPlayer._prepare(Native Method)
E/AndroidRuntime(28346):    at android.media.MediaPlayer.prepare(MediaPlayer.java:1313)
E/AndroidRuntime(28346):    at xyz.luan.audioplayers.player.MediaPlayerPlayer.prepare(MediaPlayerPlayer.kt:89)
E/AndroidRuntime(28346):    at xyz.luan.audioplayers.player.WrappedPlayer.stop(WrappedPlayer.kt:185)
E/AndroidRuntime(28346):    at xyz.luan.audioplayers.player.WrappedPlayer.onCompletion(WrappedPlayer.kt:248)
E/AndroidRuntime(28346):    at xyz.luan.audioplayers.player.MediaPlayerPlayer.createMediaPlayer$lambda-5$lambda-1(MediaPlayerPlayer.kt:17)
E/AndroidRuntime(28346):    at xyz.luan.audioplayers.player.MediaPlayerPlayer.$r8$lambda$3fK1i48Yert5dbg2Q8ZiB5tiKHg(Unknown Source:0)
E/AndroidRuntime(28346):    at xyz.luan.audioplayers.player.MediaPlayerPlayer$$ExternalSyntheticLambda1.onCompletion(Unknown Source:2)
E/AndroidRuntime(28346):    at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:3559)
E/AndroidRuntime(28346):    at android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime(28346):    at android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime(28346):    at android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime(28346):    at android.app.ActivityThread.main(ActivityThread.java:7842)
E/AndroidRuntime(28346):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(28346):    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/AndroidRuntime(28346):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
I/Process (28346): Sending signal. PID: 28346 SIG: 9
Lost connection to device.

我想由于重复执行,我在某种程度上搞砸了资源管理。因此,我想错误在一定程度上在于API的使用audioplayers.dart

EN

回答 1

Stack Overflow用户

发布于 2022-11-19 08:22:54

我不得不把ReleaseMode改为release。我所做的是使用stop将资源保存在内存中--我猜是这样--从而使内存混乱?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74498439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档