2011-12-10 51 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延遲。

相關問題