2010-11-11 15 views
7

我一直試圖重現我的QA團隊在一段時間內所稱的「隨機暫停Bug」。今天,我在使用logcat進行調試時重現了它三次。它間歇性地出現,只在網絡不好的時候出現。有時MediaPlayer prepareAsyc()在POWER按下之前不會調用onPrepared()

用戶會遇到音頻暫停,直到他們觸摸手機(按下電源或軌跡球),然後立即開始播放。這是因爲我在onPrepared回調中調用start,並且在這些情況下從不會調用start。這是我們最嚴重的錯誤。

我知道:

1)本間歇發生在Nexus One上與來自PlaybackService 2.2.1(不知道這是否是在其它設備上)

2)我叫prepareAsyc(),而設備屏幕關閉。有時,onPrepared()永遠不會被調用,所以我的後續mediaplayer.start()調用永遠不會被觸發。我可以看到網絡嗅探器和緩衝回調,緩衝正在發生。 3)如果我觸摸設備電源或軌跡球將其喚醒,onPrepared()立即被調用(已緩衝),我的回調開始播放。

這裏有與時間戳顯示問題三次日誌:

第一實例(無回調20秒,直到我打了電源按鈕):

11-10 16:10:55.966 I/AwesomePlayer( 59): calling prefetcher->prepare() 
11-10 16:11:15.511 D/KeyguardViewMediator( 94): wakeWhenReadyLocked(26) 
11-10 16:11:15.511 D/KeyguardViewMediator( 94): handleWakeWhenReady(26) 
11-10 16:11:15.511 D/KeyguardViewMediator( 94): pokeWakelock(5000) 
11-10 16:11:15.511 I/power ( 94): *** set_screen_state 1 
11-10 16:11:15.561 D/SurfaceFlinger( 94): Screen about to return, flinger = 0x1fe300 
11-10 16:11:15.701 D/AK8973 ( 64): Compass Start 
11-10 16:11:15.701 D/WifiService( 94): ACTION_SCREEN_ON 
11-10 16:11:15.711 I/Prefetcher( 59): [0x602d80] cache below low water mark, filling cache. 
11-10 16:11:15.821 I/AwesomePlayer( 59): prefetcher is done preparing 
11-10 16:11:15.831 W/MogMediaPlayer.onPreparedListener(2968): onPrepared, calling notifyPrepared() 

兩個例子(之前的第一次3秒我打動力,其次爲787-8):

11-10 16:14:54.649 I/AwesomePlayer( 59): calling prefetcher->prepare() 
11-10 16:14:57.500 D/KeyguardViewMediator( 94): wakeWhenReadyLocked(26) 
11-10 16:14:57.500 D/KeyguardViewMediator( 94): handleWakeWhenReady(26) 
11-10 16:14:57.500 D/KeyguardViewMediator( 94): pokeWakelock(5000) 
11-10 16:14:57.500 I/power ( 94): *** set_screen_state 1 
11-10 16:14:57.560 D/SurfaceFlinger( 94): Screen about to return, flinger = 0x1fe300 
11-10 16:14:57.580 D/WifiStateTracker( 94): Reset connections and stopping DHCP 
11-10 16:14:57.580 D/WifiService( 94): ACTION_SCREEN_ON 
11-10 16:14:57.670 I/Prefetcher( 59): [0xa990] cache below low water mark, filling cache. 
11-10 16:14:57.700 D/AK8973 ( 64): Compass Start 
11-10 16:14:57.800 I/AwesomePlayer( 59): prefetcher is done preparing 
11-10 16:14:57.800 W/MogMediaPlayer.onPreparedListener(2968): onPrepared, calling notifyPrepared() 



11-10 16:39:03.608 I/AwesomePlayer( 59): calling prefetcher->prepare() 
11-10 16:39:11.506 D/KeyguardViewMediator( 94): wakeWhenReadyLocked(26) 
11-10 16:39:11.506 D/KeyguardViewMediator( 94): handleWakeWhenReady(26) 
11-10 16:39:11.506 D/KeyguardViewMediator( 94): pokeWakelock(5000) 
11-10 16:39:11.506 I/power ( 94): *** set_screen_state 1 
11-10 16:39:11.566 D/SurfaceFlinger( 94): Screen about to return, flinger = 0x1fe300 
11-10 16:39:11.586 D/WifiStateTracker( 94): Reset connections and stopping DHCP 
11-10 16:39:11.586 D/WifiService( 94): ACTION_SCREEN_ON 
11-10 16:39:11.716 D/AK8973 ( 64): Compass Start 
11-10 16:39:11.766 I/Prefetcher( 59): [0x59ac18] cache below low water mark, filling cache. 
11-10 16:39:11.856 I/AwesomePlayer( 59): prefetcher is done preparing 
11-10 16:39:11.946 W/MogMediaPlayer.onPreparedListener(2968): onPrepared, calling notifyPrepared() 

有誰知道這個bug或如何解決它什麼?

由於提前, 本

回答

2

我遇到在Android 2.3.3,2.3.7和4.1.2十分類似的東西。對於我來說,在工作一段時間後,MediaPlayer隨機拒絕加載。不同的是,對我來說,電源按鈕並沒有幫助 - 什麼也沒有,onPrepared根本就不會被調用。我正在播放SD卡中的文件,而不是網絡,因此緩衝不是問題。發生頻繁加載文件時發生的情況會更多,但通常情況下,該錯誤通常足以影響所有我的用戶。

你的問題似乎與我的相關,但可悲的是我也沒有給你答案。我在這裏張貼這個來收集關於這個問題的更多信息。我嘗試使用setDataSource,prepare,prepareAsync以及MediaPlayer.create()方法,該方法立即開始加載指定的文件。我嘗試重複使用相同的mediaplyer(使用mp.reset()),併爲每個要加載的新文件創建一個全新的文件(我預先停止並在先前的播放器上調用release()),但沒有任何區別:如果用戶開始更快速地切換文件(但沒有任何過多 - 我期望任何媒體應用程序來處理這個問題),每5個文件中有近1個文件無法指示失敗或加載。

0

最後在另一個線程中找到了解決方案,其中有人遇到了使用MediaPlayer here流式傳輸音頻的問題。

訣竅是在通過wakeLock準備下一個音軌之前喚醒設備。這不會導致屏幕亮起,所以不用擔心。描述我是如何最終做到的here

相關問題