【问题标题】:Android live stream never starts after MEDIA_INFO_BUFFERING_START with MediaPlayer在使用 MediaPlayer 的 MEDIA_INFO_BUFFERING_START 之后,Android 直播永远不会开始
【发布时间】:2013-08-28 07:37:55
【问题描述】:

我正在构建一个从外部服务器流式传输实时音频的应用。流式传输一段时间(通常为 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 在作为前台启动的服务中运行,我非常有信心我的实施遵循 google 的所有准则:http://developer.android.com/guide/topics/media/mediaplayer.html

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

【问题讨论】:

  • 当我通过 UI 手动停止播放器时,我得到了丢失的回调:MEDIA_INFO_BUFFERING_END。
  • 也有这个问题。当我得到 703 然后是 701 时,我可以重新启动流(阅读:hack)(这似乎是快速启动的事情),但是某些流以某种方式导致这些事件在播放约 2 秒后触发 - 换句话说:这些流将每 2 秒重新启动一次秒,如果我使用这个“黑客”
  • 也看到了这个。装有 Android 4.3 的 Galaxy Nexus。虽然我没有看到 703,只有 701,有时即使屏幕仍然亮着,wifi 图标仍然显示很强的信号。你找到解决方案了吗?
  • 更正:我也看到了 703,正如你所描述的那样,多了一个 0。

标签: android streaming android-mediaplayer


【解决方案1】:

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2020-01-23
    相关资源
    最近更新 更多