我正在构建一个从外部服务器流式传输实时音频的应用。流式传输一段时间后(通常为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上测试了我的应用。
答案 0 :(得分: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();