0

由于我的最后一个问题在我使用简单的 medaiplayer 的地方没有得到解答(连续播放更多声音时声音有时会保持沉默,为什么?)并尝试使用 SoundPool 创建整个东西。但你猜怎么着,几乎同样的事情发生了,但有一个错误

AudioFlinger could not create track, status: -12
Error creating AudioTrack

我读到最多可以将 32 个声音存储在 soundpool 的内存中,然后我会收到错误消息。没错,在第 32 个声音之后,我无法播放任何声音,因为我总是收到错误消息。那么我怎样才能在 SoundPool 中使用超过 32 种声音呢?我尝试使用 3 个 Soundpool,每个 Soundpool 有 20 个声音,我总是使用以下方法从其他池中卸载所有声音:

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

但是同样的错误又来了。(我使用 22k 声音而不是 44.1k,我读到这可以解决它,但什么也没发生)任何建议表示赞赏。到底是什么,我既不能用 mediaplayer 也不能用 soundpool 播放大约 50 种声音?这怎么可能??

release()

    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));

所以我清除了 hashmp,然后卸载了所有的声音,然后我释放了 soundpool。然后我再次填充哈希图,但现在它根本没有给我任何声音。我一定错过了什么,你能告诉我什么吗?

4

2 回答 2

1

AudioMixer 有一个限制,只能同时允许 32 个 AudioTrack。只要 SoundPool 开始播放属于该池的通道之一(我猜这对应于一个样本),它就会尝试创建一个 AudioTrack。但是,在您销毁 SoundPool 之前,该轨道不会被销毁,因此即使已停止轨道名称仍将保持分配状态。

您可以尝试调用release()您的 SoundPool。这应该会导致本机 SoundPool 对象被破坏,从而破坏它创建的所有 AudioTrack 并在 AudioMixer 中取消分配它们的名称。

于 2012-10-24T15:42:23.360 回答
0

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

SoundPool文档实际上对典型用例有很好的描述。

于 2012-10-24T15:41:17.360 回答