客户端或E / MediaPlayer拒绝AUDIO_OUTPUT_FLAG_FAST:错误(1,-19)

时间:2017-05-24 05:55:18

标签: audio libgdx

我正在使用Libgdx创建游戏。我有很多MP3格式的小声音文件,因为它有很多我不预装它们。我只加载我想要播放的声音,如下所示:

actorSound = Gdx.audio.newSound(Gdx.files.internal(sound));

上面的代码效果很好,但其余的声音并不幸运。上面的演员有自己的类,每次触摸时都会播放不同的声音。

当我尝试在我的游戏屏幕中播放声音时,出现以下错误:

  

客户拒绝了AUDIO_OUTPUT_FLAG_FAST

所有音频文件都具有相同的属性,并使用相同的麦克风和麦克风进行录制。大胆。这些文件都是44100Hz,每个文件只有几个kb。

我想知道为什么演员演奏的声音和其他声音不起作用?

我决定尝试将非工作声音改为音乐,而现在它们播放得很好 - 有一段时间了。我可以玩完整的游戏,返回菜单并重新开始新游戏。我第二次开始游戏时,我只从游戏画面获得3个声音然后除了演员的声音之外它是静音的。出现的错误如下所示:

  

E / MediaPlayer:错误(1,-19)

我按照与声音相同的方式加载音乐:

gameSound = Gdx.audio.newMusic(Gdx.files.internal(soundeffect));

我通过阅读这些帖子来研究这两个错误:

AUDIO_OUTPUT_FLAG_FAST denied by client

Mediaplayer error (-19,0) after repeated plays

但我不知道该怎么做或改变以解决我的问题。如果可能的话,我更喜欢Sound,但音乐是一种可接受的解决方法......

说到音乐,可能就像网址中所建议的那样,我没有发布媒体播放器。我不知道该怎么办?

当我将GameScreen留给另一个屏幕时,比如MenuScreen或RewardScreen,我首先处理音乐。其他屏幕也使用音乐,并在需要时加载声音。当我改回GameScreen时,我再次处置然后开始一个新的游戏......

有任何想法或建议吗?非常感谢任何帮助。

我按照建议添加了AssetManager,现在我有一个可以加载所有声音的loding屏幕。我把它们作为声音加载而不是音乐,这就是我喜欢它的方式。

声音在实际游戏中效果很好但是一旦我进入奖励屏幕,只播放第一个声音,之后应用程序崩溃并出现以下错误:

06-02 07:47:09.774 6208-6282E/AndroidRuntime: FATAL EXCEPTION: GLThread 2935

Process: PID: 6208

java.lang.NullPointerException: Attempt to read from field 'com.badlogic.gdx.assets.AssetManager 
Assets.Assets.manager' on a null object reference
at DelayedSounds(RewardsScreen.java:538)  
at RewardsScreen.Update(RewardsScreen.java:567)
at Screens.RewardsScreen.render(RewardsScreen.java:577)
at Game.render(Game.java:46)
at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:459)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1562)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1262)
06-02 07:47:13.823 6208-6208 E/AndroidGraphics: waiting for pause 
synchronization took too long; assuming deadlock and killing

DelayedSounds方法如下所示:

    public void DelayedSounds(){
    timer = timer + Gdx.graphics.getDeltaTime();
    if(playitem == true && timer > 2){
        itemsound = "vinster/" + item + ".mp3";
        assets.manager.get(itemsound, Sound.class).play(volume);
        //sound = Gdx.audio.newMusic(Gdx.files.internal(itemsound));
        //sound.setVolume(volume);
        //sound.play();
        playitem = false;
    }
    if(playkeep == true && time > 3){
        assets.manager.get("dialog/VINSTEN.mp3", Sound.class).play(volume);
        //sound = Gdx.audio.newMusic(Gdx.files.internal("prizes/prize.mp3"));
        //sound.setVolume(volume);
        //sound.play();
        playkeep = false;
    }
}

可以看出我现在使用AssetManager,并为了测试目的而注释掉了我的旧代码。我在我的主类中定义AssetManager,然后将其传递给使用声音的所有其他类。 RewardsScreen只会播放第一个声音,然后它会在NULL对象引用上崩溃。

如果我将我的代码更改回RewardsScreen中的音乐,它可以正常工作(请参阅已下映的代码)

我试图播放的声音在两种情况下完全相同。处理所有资产加载的资产类包含声音,因为我仍然得到一个NULL对象,我假设一个或多个项目无法加载?

我搜索日志并找到它加载声音的位置:

06-02 08:05:09.360 9844-9888/E/WVMExtractor: Failed to open libwvm.so: dlopen failed: library "libwvm.so" not found
06-02 08:05:09.395 9844-9888/ E/NdkMediaExtractor: sf error code: -1010
06-02 08:05:09.395 9844-9888/ E/SoundPool: Unable to load sample

也许这与我的问题有关? 我以相同的方式加载所有声音,并且绝对看起来很有效,加载是常规的:

    manager.load("prizes/cash.mp3", Sound.class);

我仍然发现我的日志中的客户端拒绝了AUDIO_OUTPUT_FLAG_FAST,但现在声音正在播放而不是被拒绝。

关于如何解决这个问题的更多想法?

1 个答案:

答案 0 :(得分:0)

您的链接有足够的信息来处理您的错误。

每次在游戏中创建资源实例,创建一次以及在游戏中使用整个游戏都是不好的方法,如果可能的话,使用AssetManager

在游戏的Music方法中创建onCreate()实例。

gameSound = Gdx.audio.newMusic(Gdx.files.internal(soundeffect));

Music拥有play()resume()和许多其他有用的methods

您还可以查看this,这可能会有帮助。