Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用SoundPool播放32种以上的声音?_Android_Hashmap_Media Player_Soundpool - Fatal编程技术网

Android 如何使用SoundPool播放32种以上的声音?

Android 如何使用SoundPool播放32种以上的声音?,android,hashmap,media-player,soundpool,Android,Hashmap,Media Player,Soundpool,因为我的上一个问题还没有得到回答,我在哪里使用了simplemedaiplayer(),并试图使用SoundPool创建整个东西。但是你猜怎么着,几乎同样的事情发生了,只是有一个错误 AudioFlinger could not create track, status: -12 Error creating AudioTrack 我了解到soundpool内存中最多可以存储32个声音,然后我会得到错误。没错,在第32个声音之后,我不能播放任何声音,因为我总是会出错。那么,如何在SoundPo

因为我的上一个问题还没有得到回答,我在哪里使用了simplemedaiplayer(),并试图使用SoundPool创建整个东西。但是你猜怎么着,几乎同样的事情发生了,只是有一个错误

AudioFlinger could not create track, status: -12
Error creating AudioTrack
我了解到soundpool内存中最多可以存储32个声音,然后我会得到错误。没错,在第32个声音之后,我不能播放任何声音,因为我总是会出错。那么,如何在SoundPool中使用32种以上的声音呢?我尝试使用3个声音池,每个声音池中有20个声音,我总是使用以下方法卸载其他声音池中的所有声音:

    mSoundPoolMapV1.clear();  //clearing HashMap
    for(int i=1;i<15;i++){
    mSoundPoolV1.unload(i);  
    }

所以我清除hashmp,然后卸载所有声音,然后释放声音池。然后我再次填充hashmap,但现在它完全没有声音。我一定错过了什么,你能告诉我什么吗?

底层音频硬件不是无限的。你一次只能记住这么多的声音。当我为台式机制作3D音频库时,限制是可变的,因此我必须在启动之前从硬件查询限制,否则它会导致看似随机的故障。您应该有一个单一的声音池,只需根据需要将声音加载和卸载到中即可。然后,您需要为应该播放的声音设置某种优先级,以便确保您真正需要的声音不会被卸载以播放可选的背景噪音


实际上,对一个典型用例有一个非常好的描述。

音频混音器有一个限制,在同一时间只允许32个音频曲目。每当SoundPool开始播放属于该池的一个频道(我猜这对应于一个示例),它就会尝试创建一个音频曲目。但是,在销毁声音池之前不会销毁曲目,因此即使已停止播放,曲目名称仍将保持分配状态


您可以尝试在声音池中调用
release()
。这将导致本机SoundPool对象被销毁,从而销毁它创建的所有音轨,并在AudioMixer中取消分配它们的名称。

我通过释放该池编辑了代码,但当我按下按钮时,不会播放任何声音。我错过了什么吗?从来没有玩过,还是刚刚发布第一批并尝试加载/播放另一批?如果您发布使用最新代码录制的日志,可能会有所帮助。在onCreate中,我加载日志并可以播放它们,然后我按按钮执行我编写的上部代码(也发布),则声音无法播放。调用release()后,您应该创建一个新的声音池。正如SoundPool.release()的文档说明所述:“SoundPool不能再使用,引用应该设置为null。”谢谢,我真不好意思,我跳过了这一部分。谢谢你的帮助,现在一切正常!我希望以后能保持这样:)谢谢你的博士,我花了一些时间阅读了它,发现它非常有用!
    mSoundPoolMap.clear();
    for(int i=1;i<50;i++){
    mSoundPool.unload(i);
    }
    mSoundPool.release();

    mSoundPoolMap.put(1, mSoundPool.load(Main.this, R.raw.sound1, 1));
    ...
    mSoundPoolMap.put(50, mSoundPool.load(Main.this, R.raw.sound50, 1));