首页 文章

Android MediaPlayer流媒体在网络更改时停止

提问于
浏览
15

我在Android上使用MediaPlayer传输音频 .

当设备从Wi-Fi移动到蜂窝网络或反之亦然时,MediaPlayer停止播放 .

通常,缓冲区中有几秒钟的音频,因此播放不会立即停止 .

理想情况下,我想选择不间断播放的流,但我看不到如何做到这一点 .

我正在处理服务器上托管的mp3文件和实时广播流 .

4 回答

  • 14

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

    你也可以听你 onError()MEDIA_ERROR_SERVER_DIED 然后你可以再次关闭 prepareAsync() .

    您会发现MediaPlayer将出错或完成 . 如果您处理这两个回调,至少可以做的是在网络更改时重新启动流,就像平滑播放一样..这需要自定义媒体框架,因为Android设备非常粗制滥造 .

  • 0

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

    如果您正在下载的服务器不支持跟踪流(例如秒数,序列,字节)(与媒体服务器不同),则必须再次从0字节开始为您的mp3提供服务 .

    如果您的URL指向位于标准HTTP服务器上的MP3文件,您的情况将是您期望的 . 您应该考虑使用媒体流服务器,以便您可以根据自己的选择继续下载/流式传输 . 当您收到连接丢失/恢复的意图时,您可以将您的媒体播放器指向URL中具有文件位置的新URL(例如,秒= 19,字节= 57365) .

    不确定这是否对你有所帮助,但它解释了“在幕后”发生了什么 .

  • 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仅在您切换网络时 paused ,而不是停止 .

  • 1

    正如Vidar所说,重新 Build 连接将被服务器视为新连接 .

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

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

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

    当新缓冲区足够开始播放时,我可以将播放切换到它 . 如果我正在传输文件,在服务器支持和一点点工作的情况下,我可以确保当前播放位置数据在两个缓冲区中并无缝切换 .

    由于实时流缓冲区无法同步,因此切换时不可避免会出现故障 .

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

    Chris.Jenkins提到了一些可以提供帮助的MediaPlayer方法,但指出这似乎需要一个自定义框架 . 它需要处理他提到的条件和其他条件 .

    如果我能让它看起来漂亮,我会在这里发布 . 我要打开这个问题 .

相关问题