Android实时流媒体在MediaPlayer的MEDIA_INFO_BUFFERING_START后从未开始播放

3
我正在开发一个从外部服务器流式传输实时音频的应用程序。在流式传输一段时间后(通常为5-20分钟),音频播放会停止。首先我会收到703-MEDIA_INFO_NETWORK_BANDWIDTH(通常与extra = 0一起出现),然后是701-MEDIA_INFO_BUFFERING_START,但我从未收到702-MEDIA_INFO_BUFFERING_END。我没有收到onCompletion或onError的回调。
A small stack:

08-28 09:18:17.969: WARN/MediaPlayer(7100): info/warning (703, 0)

08-28 09:18:17.969: WARN/MediaPlayer(7100): info/warning (701, 0)

08-28 09:18:17.969: INFO/MediaPlayer(7100): Info (703,0)

08-28 09:18:17.979: INFO/MediaPlayer(7100): Info (701,0)

08-28 09:18:18.029: DEBUG/dalvikvm(7100): GC_CONCURRENT freed 1307K, 15% free 13198K/15376K, paused 5ms+3ms, total 28ms

08-28 09:18:19.411: DEBUG/dalvikvm(16310): GC_CONCURRENT freed 315K, 4% free 9909K/10264K, paused 7ms+6ms, total 69ms

08-28 09:18:20.992: DEBUG/audio_hw_primary(176): out_standby: enter: usecase(1: low-latency-playback)

08-28 09:18:21.082: DEBUG/audio_hw_primary(176): stop_output_stream: enter: usecase(1: low-latency-playback)

08-28 09:18:21.082: DEBUG/audio_hw_primary(176): disable_audio_route: reset mixer path: low-latency-playback

08-28 09:18:21.082: DEBUG/audio_hw_primary(176): disable_snd_device: snd_device(4: headphones)

08-28 09:18:21.102: DEBUG/audio_hw_primary(176): stop_output_stream: exit: status(0)

08-28 09:18:21.102: DEBUG/audio_hw_primary(176): out_standby: exit 

正如您所看到的,audio_hw_primary中发生了一些可疑的事情。我已经搜索了它是什么,但没有找到好的答案。

我的MediaPlayer在一个作为前台启动的服务中运行,我非常有信心我的实现遵循了谷歌的所有指南:http://developer.android.com/guide/topics/media/mediaplayer.html

我已经在Android 4.1-4.3的Nexus 4上测试了我的应用程序。


当我通过用户界面手动停止播放器时,我会收到缺失的回调:MEDIA_INFO_BUFFERING_END。 - smult
我也遇到了这个问题。当我收到703和701时,我可以重新启动流(即:黑客入侵)来解决问题(这似乎能够启动事情),但有些流会在播放大约2秒后触发这些事件 - 换句话说:如果我使用这种“黑客入侵”,这些流将每2秒重新启动一次。 - REJH
同样遇到这个问题。我的Galaxy Nexus安装的是Android 4.3系统。虽然我没有看到703错误,只看到701错误,有时候甚至在屏幕还亮着、WiFi信号强度很好的情况下也会出现。你找到解决方法了吗? - Thomas
更正:我也看到了703,就像你描述的那样,多了一个0。 - Thomas
1个回答

0

http://developer.android.com/guide/topics/media/mediaplayer.html 你需要阅读关于“使用唤醒锁”的内容。

为了确保在MediaPlayer播放时CPU继续运行,请在初始化MediaPlayer时调用setWakeMode()方法。一旦这样做,MediaPlayer在播放时将持有指定的锁,并在暂停或停止时释放该锁:

mMediaPlayer = new MediaPlayer();
// ... other initialization here ...
mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);

然而,在此示例中获取的唤醒锁只能保证CPU保持唤醒状态。如果您正在通过网络流媒体,并且使用Wi-Fi连接,您可能还需要持有一个WifiLock,您必须手动获取和释放。因此,当您开始使用远程URL准备MediaPlayer时,应创建并获取Wi-Fi锁。例如:
WifiLock wifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE))
    .createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock");

wifiLock.acquire();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接