首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有时MediaPlayer prepareAsyc()直到按下电源后才会调用onPrepared()

有时MediaPlayer prepareAsyc()直到按下电源后才会调用onPrepared()
EN

Stack Overflow用户
提问于 2010-11-11 10:25:59
回答 2查看 958关注 0票数 7

一段时间以来,我一直在尝试重现我的QA团队所说的“随机暂停Bug”。今天,我在使用logcat进行调试时复制了它三次。它间歇性地出现,并且仅在较差的网络中出现。

用户经历音频暂停,直到他们触摸他们的手机(按下电源或轨迹球),它立即开始播放。这是因为我在onPrepared回调中调用了start,而在这些情况下从不调用start。这是我们最严重的bug。

我所知道的:

1)在带有2.2.1的Nexus One上间歇性地发生这种情况(不确定它是否在其他设备上)

2)当设备屏幕关闭时,我从PlaybackService调用prepareAsyc()。有时,永远不会调用onPrepared(),因此我随后的mediaplayer.start()调用永远不会触发。通过网络嗅探器和缓冲回调,我可以看到缓冲正在发生。

3)如果我触摸设备的电源或轨迹球来唤醒它,onPrepared()立即被调用(已经缓冲),并且我的回调开始播放。

以下是带有时间戳的日志,该问题显示了三次:

第一个例子(20秒内没有回调,直到我按下电源按钮):

代码语言:javascript
运行
复制
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()

另外两个例子(我第一次点击power前3秒,下一次是8秒):

代码语言:javascript
运行
复制
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或者如何解决它的问题?

先谢谢你,本

EN

回答 2

Stack Overflow用户

发布于 2013-11-19 04:16:09

我在Android 2.3.3,2.3.7和4.1.2上遇到了非常类似的事情。对我来说,在正常工作了一段时间后,MediaPlayer随机拒绝加载。不同的是,对我来说,电源按钮也帮不上忙--什么都帮不上忙,根本就不调用onPrepared。我正在播放SD卡上的文件,而不是网络上的文件,所以缓冲不是问题。当文件被频繁加载时,它更容易发生,但通常情况下,该错误很容易发生,足以影响我的所有用户。

你的问题似乎与我的有关,但遗憾的是我也没有给你一个答案。我在这里张贴这篇文章是为了收集更多关于这个问题的信息。我尝试使用setDataSource、prepare、prepareAsync以及MediaPlayer.create()方法,它会立即开始加载指定的文件。我试着重用相同的媒体播放器(使用mp.reset()),并为每个要加载的新文件创建一个全新的媒体播放器(我会在之前的播放器上停止并调用release() ),但没有什么是不同的:如果用户开始以更快的速度切换文件(但没有过多-我希望任何媒体应用程序都能处理这个问题),接近每5个文件中就有1个文件无法指示失败或加载。

票数 2
EN

Stack Overflow用户

发布于 2016-04-05 19:03:14

最终在另一个线程中找到了解决方案,其中有人在使用MediaPlayer here流式传输音频时遇到了一些问题。

诀窍是在下一首曲目准备好之前通过wakeLock唤醒设备。这不会导致屏幕亮起,所以不用担心。描述了我最终是如何做到的,here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4150907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档