我在Android上播放Ogg Vorbis声音时遇到了一个奇怪的问题,我很难纠正。我使用SoundPool类播放声音。除了暂停后播放的第一个声音外,它非常有效。为什么我的SoundPool声音不能在Android上首次播放?
下面是我遇到的问题:我有一个菜单上有几个按钮。如果我按了一个按钮,我会打嘀嗒声。但是,我第一次尝试演奏一个,它不会发出声音。然后,如果我再次点击相同的菜单按钮,它就会起作用。如果我再延迟下一次按几秒钟,问题就会重新出现。具体来说,我看到以下行为:
- 等待几秒钟
- 触摸UI按钮,这应该发出声音......它不
- 日志猫报告“AudioFlinger:写阻塞165毫秒, AudioHardware PCM播放进入待机‘
- 触摸UI按钮,SH:66个延迟写入,线程0xec40" AudioHardwareQSD
- 等待几秒钟
- 日志猫报告(当我触摸UI按钮立即发生)’会发出声音......它不会。
- logcat的报告“AudioFlinger:写阻塞166毫秒,67个延迟写入,螺纹0xec40”(当我触摸UI按钮立即发生),再次
- 触摸UI按钮,但前 AudioHardwareQSD显示待机信息...声音工作!
我在几个不同的设备上看到过这种现象:HTC Incredible,根深蒂固的Nook Color和HTC Thunderbolt,所以我不认为它是特定设备。
我在猜测这是AudioHardwareQSD进入待机状态的功能。一旦它处于待机状态,滑道中的第一个声音就会被忽略,而随后的声音会一直工作,直到它再次进入待机状态。 HTC Incredible的'写封锁'消息和AudioHardwareQSD消息之间大约有3秒的延迟。
这里有一个关于使用WakeLock来防止这种情况发生的StackOverflow的答案。我尝试了这个解决方案,但并没有解决我的问题。
这是怎么发生的?有没有办法阻止AudioHardwareQSD进入待机状态?有没有人有任何提示解决这个问题?
谢谢!
更新:我已经能够实施一个相当粗略的解决方法,可以解决此问题。在我的应用程序(游戏)中,我有一个更加健全的渲染类。我添加了一个由游戏逻辑定期执行的新方法present()。该方法使用1.5秒超时定时器。当计时器落到底时,声音渲染器将播放由50ms静音组成的音频文件,然后重置计时器。
这已纠正我的问题......远离最佳,但它的工作原理。
我有同样的问题!我不明白你的解决方案可以帮助我吗? – user1163234
我使用长度为50ms的Audacity生成了一个声音文件,并且只包含沉默。每1.5秒,我只是播放这个声音文件。这解决了上述问题。 – MutantXenu
谢谢!找到了解决方案也check.out它。 http://stackoverflow.com/questions/12261867/soundpool-not-playing-after-3-second-of-opening-my-activity – user1163234