2011-12-10 54 views
2

我在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静音组成的音频文件,然后重置计时器。

这已纠正我的问题......远离最佳,但它的工作原理。

+0

我有同样的问题!我不明白你的解决方案可以帮助我吗? – user1163234

+0

我使用长度为50ms的Audacity生成了一个声音文件,并且只包含沉默。每1.5秒,我只是播放这个声音文件。这解决了上述问题。 – MutantXenu

+0

谢谢!找到了解决方案也check.out它。 http://stackoverflow.com/questions/12261867/soundpool-not-playing-after-3-second-of-opening-my-activity – user1163234

回答

1

Android SoundPool真的很糟糕。我必须

int streamid = soundPool.play(sid, soundVolume, soundVolume, 0, loopVal, 1.0f); 
    if (streamid == 0) { 
    try { 
    Thread.sleep(50); 
    } catch (InterruptedException e) { 
    e.printStackTrace(); 
    } 
    } 
} while(streamid == 0 && retry++<3); 

但是这并不理想,它确实减慢了帧率。

0

四年,因为原来的职位和我有同样的问题!就我而言,它在使用Android API 19的三星Galaxy S3上。但是我发现了一个不同的解决方案,它不需要在一定的时间间隔播放无声的声音。

相反,我发现它只是第一次播放的音频文件的第一部分(50-100ms)。因此,编辑我的声音文件,以便在开始时生成的mp3有大约100ms的静音,然后播放正确。按钮点击几乎看不到100ms延迟。

相关问题