我有一个音频流应用程序,它运行本地代理服务器。本地代理服务器与互联网流媒体源建立 http 连接,在本地获取和缓冲流数据。然后,在应用程序内部,我使用 MediaPlayer 连接到本地代理服务器,使用方法
mediaPlayer.setDataSource(...); // the url of the local proxy server
一切都很好(有很多 Android 设备和不同的操作系统版本 - 1.5...4.0),直到 Nexus 7 发布。
在 Nexus 7 中,媒体播放器拒绝播放来自本地代理服务器的源。
当我查看日志时,似乎 MediaPlayer 在内部使用范围请求。我的本地代理服务器无法处理。它返回 HTTP/1.0 200 OK 和数据。但是,媒体播放器不喜欢这样并抛出异常:
Caused by: libcore.io.ErrnoException
?:??: W/?(?): [ 07-18 00:08:35.333 4962: 5149 E/radiobee ]
?:??: W/?(?): : sendto failed: ECONNRESET (Connection reset by peer)
?:??: W/?(?): at libcore.io.Posix.sendtoBytes(Native Method)
?:??: W/?(?): at libcore.io.Posix.sendto(Posix.java:146)
?:??: W/?(?): at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:
?:??: W/?(?): at libcore.io.IoBridge.sendto(IoBridge.java:473)
We requested a content range, but server didn't support that. (responded with 200)
根据 http 规范,如果服务器以 HTTP/1.0 而不是 1.1 响应,则客户端不得触发范围请求(无论如何 1.0 都不支持),
此外,如果服务器不支持范围请求,它应该没问题,如果它以 200 OK 响应(这就是我正在做的),但 Nexus 7 上的 MediaPlayer 实现不喜欢那样。
我看了一下这个线程: HTTP:当 Range 不受支持时,我应该如何响应“Range:bytes=”?
,他们声称 200 OK 的响应必须足够好,但不幸的是它没有帮助。
我不确定这是 Jelly Bean 的问题,还是 Nexus 7 实现的问题,但这对我来说仍然是一个我必须解决的问题。
同样,使用相同应用程序的许多其他 Android 设备上也没有范围请求。出于某种原因,这些范围请求现在正在 Nexus 7 上发生。(它也可能发生在其他 Android 设备上,但同样,到目前为止,我从未发生过)。
任何可能的方法来禁用 MediaPlayer 的范围请求?
如果没有,任何人都可以建议我的代理服务器逻辑的快速修复(如果它收到此范围请求,它究竟必须返回什么?),如果可能的话,不改变我的其他逻辑?
似乎我可能必须返回类似“HTTP/1.0 206 OK\r\nPartial Content\r\n\r\n”的内容,但可能在部分内容的末尾应该有一些值 - 不确定应该是什么成为这个。
您的帮助将不胜感激。
谢谢..