2011-08-16 99 views
3

我们使用MediaPlayer来流式传输首先缓存到本地文件的MP3音乐,MediaPlayer将通过本地服务器传输它。它工作得非常好(约1.5年在任何Android> 1.6设备),直到索尼爱立信Xperia X10更新到Android 2.3.3。突然,只有在该设备和Android 2.3.3音频流停止工作。Android MediaPlayer“通过对等方重置连接”

MediaPlayer偶尔会出现错误(100,0),但大多数情况下它只是堆积在MediaPlayer.prepareAsync()方法上。 调查显示,问题原因时

“java.net.SocketException: Connection reset by peer” 

指向行:

outstream.write(buffer, skipFirst, length); 

它的方式成功地异常之前执行的2倍

的代码非常复杂,所以我很难在这里提供它,但如果需要,我可以返回更多信息。

由于某种原因MediaPlayer仅在我们开始填充内容时关闭连接。也似乎很奇怪,不时(1/20)MediaPlayer成功播放音乐。

任何想法?

回答

0

能够帮助您更多我认为我们需要一些代码片段和调试日志。你能为我们安排一下吗?或者,如果你能够通过我的APK版本(如果你喜欢的话,我不希望从你那里窃取你的想法),然后我可以在我们的其他手机上测试apk,那就更好了。

Johan,Sony Ericsson开发人员支持

+0

@Johan - 看到完全相同的问题 - 与您联系的最佳方式是什么? –

+0

我已经离线了很长时间了。抱歉。尝试[email protected] –

2

确保您的代理正确解析Range HTTP标头。 Xperia设备以Range: bytes=10000-20000的形式发送范围请求,而不是更常见的Range: bytes=10000-

我不确定这是否真的存在问题,但它固定播放某些较新的Xperia设备,我猜测旧设备上的MediaPlayer会非常相似。

0

当您寻找或跳过连接或丢失连接并且MediaPlayer保持重新连接到代理服务器时,必须在获取客户端的请求和范围(int)后,使用状态206发送此响应。

String headers += "HTTP/1.1 206 Partial Content\r\n"; 
headers += "Content-Type: audio/mpeg\r\n"; 
headers += "Accept-Ranges: bytes\r\n"; 
headers += "Content-Length: " + (fileSize-range) + "\r\n"; 
headers += "Content-Range: bytes "+range + "-" + fileSize + "/*\r\n"; 
headers += "\r\n"; 

而当你收到来自MediaPlayer的一个要求,即不包含范围在HTTP报头,那么就请求新的流文件,在这种情况下,你的响应头应该是这样的:

String headers = "HTTP/1.1 200 OK\r\n"; 
headers += "Content-Type: audio/mpeg\r\n"; 
headers += "Accept-Ranges: bytes\r\n"; 
headers += "Content-Length: " + fileSize + "\r\n"; 
headers += "\r\n"; 

享受!

相关问题