我一直试图重现我的QA团队称之为“随机暂停错误”的内容已有一段时间了。今天,我在使用logcat进行调试时再现了三次。它间歇性出现,只在网络不佳中出现。
用户会遇到音频暂停,直到他们触摸手机(按下电源或轨迹球)并立即开始播放。这是因为我在onPrepared回调中调用start,并且在这些情况下从不调用start。这是我们最严重的错误。
我所知道的:
1)这种情况会在带有2.2.1的Nexus One上间歇性地发生(不确定它是否在其他设备上)
2)当设备屏幕关闭时,我从PlaybackService调用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()
另外两个例子(我在击中力量之前的第一次,下一次是8s):
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或如何解决它?
提前致谢, 本
答案 0 :(得分: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个未能指示失败或加载。
答案 1 :(得分:0)