2012-07-29 90 views
13

我使用Android上的MediaPlayer流式传输音频。Android MediaPlayer流式传输停止网络变化

当设备从Wi-Fi移动到单元网络或反之时,MediaPlayer停止播放。

通常在缓冲区中有几秒钟的音频,所以播放不会立即停止。

理想情况下,我想拿起不间断播放的流,但我看不出如何去做。

我正在使用托管在服务器上的mp3文件和实况广播流。

+0

任何代码与我们分享? – Erol 2012-07-30 00:25:51

+0

有很多的例子,如果你需要帮助的MediaPlayer的侧边栏,但它真的很简单: 'MediaPlayer的mMediaPlayer = MediaPlayer.create(背景下,Uri.parse(URL));' 'mMediaPlayer.prepare(); ' 'mMediaPlayer.start();' 会让你开始。 如果您连接到Wi-Fi并拥有3G覆盖范围,请关闭Wi-Fi,同时停止播放和播放。 – lightversusdark 2012-07-30 03:35:57

+2

是的,我知道如何使用媒体播放器。我只是问你是否以这种方式尝试过任何事情,并想分享你的进展,以便我们改进。 – Erol 2012-07-30 04:04:43

回答

0

我不知道为什么你的媒体播放器正在停止,但也许你可以添加一个onReceive方法,并在该方法中放置“mp.start()”以使其重新开始播放。
Android, How to handle change in network (from GPRS to Wi-fi and vice-versa) while polling for data

您可能需要做一个单独的类,但应该说明如何创建一个当您切换网络,被调用的方法,在这一点你可以称之为“mp.start()”来恢复播放(假设mp是你的MediaPlayer)。
这当然假设您的MediaPlayer只在暂停切换网络,而不是停止。

14

从服务器的角度来看,将网络模式从WiFi更改为3G(反之亦然),将看起来像是来自单独IP(客户端)的全新连接。

如果您下载的服务器不支持跟踪流(例如秒数,序列,字节数)(与媒体服务器不同),它将不得不从0字节开始再次提供您的mp3。

如果您的URL指向位于标准HTTP服务器上的MP3文件,那么您的状况就是期望的。您应该考虑使用媒体流媒体服务器,以便您可以根据需要继续下载/流媒体。当您收到连接丢失/恢复的意图时,您可以将您的mediaplayer指向带有URL中文件位置的新URL(例如seconds = 19,bytes = 57365)。

不知道这是否对你有帮助,但它解释了“幕后”发生了什么。

1

尝试设置您的setOnCompletionListenersetOnErrorListener。在完成直播后,您可以再次致电prepareAsync(),这将再次启动流。除非您编写自己的媒体框架,否则没有一种优雅的方式可以做到这一点。

你也可以听你onError()MEDIA_ERROR_SERVER_DIED然后你可以再次发射prepareAsync()

您会发现MediaPlayer将会出错或完成。如果你处理这两个回调,至少你可以做的就是重新启动网络变化的流,就像流畅的回放..这将需要自定义的媒体框架,因为Android的是非常低劣的。

0

正如Vidar所说,重新建立连接将被服务器视为一个新的连接。

看起来我必须双重缓冲音频播放,这意味着构建一个自定义媒体播放器。这可以提供连续的音频,但在收听直播时仍会跳过。

因为我可以知道播放位置,所以MP3文件更容易一些。直播不是这样。

正如gmaster所说,当网络发生变化时,我需要一个广播接收器来建立一个新的连接。 来自以前网络连接的音频缓冲区应该继续播放,同时通过新连接填充新的音频缓冲区。

当新的缓冲区足够开始播放时,我可以切换播放。 如果我正在流媒体文件,支持服务器和一点点工作,我可以确保当前的播放位置数据在两个缓冲区中并无缝切换。

由于实时流缓冲区不能同步,切换时不可避免地会出现小故障。

如果连接需要一段时间才能建立,较大的缓冲区将避免音频丢失,但会延迟首次播放的开始。 MP3文件可以被下载并且比实时更快地填充缓冲区,但实时流将实时缓冲。

Chris.Jenkins提到了一些MediaPlayer方法,可以帮助但指出这确实需要一个定制框架。它需要处理他所提及的条件和其他条件。

如果我可以让它看起来很漂亮,我会在这里发布。我要保持这个问题的开放性。