安卓MediaPlayer报错"Connection reset by peer"

3
我们正在使用MediaPlayer来流式传输mp3音乐,该音乐首先会被缓存到本地文件中,然后通过localserver进行流式传输。这种方式在任何Android版本大于1.6的设备上都非常好用,直到索尼爱立信Xperia X10升级到Android 2.3.3之后。突然之间,只有该设备和Android 2.3.3版本的系统无法正常进行音频流媒体传输。 MediaPlayer偶尔会出现错误(100,0),但大部分情况下它会停止在MediaPlayer.prepareAsync()方法上。经过调查发现,问题是由以下原因引起的:
“java.net.SocketException: Connection reset by peer” 

这指向以下行:

outstream.write(buffer, skipFirst, length); 

顺便提一下,在出现异常之前成功执行了2次

这段代码相当复杂,所以很难在这里提供它,但如果需要,我可以提供更多信息。

由于某些原因,MediaPlayer 在我们开始填充内容时就关闭了连接。另外,似乎相当奇怪的是,有时(1/20)MediaPlayer 成功播放音乐。

有什么想法吗?

3个回答

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头中的Range的请求时,它正在请求一个新的流文件,在这种情况下,您的响应头应该如下所示:

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";

享受吧!


0
为了更好地帮助您,我认为我们需要一些代码片段和调试日志。您能为我们安排一下吗?如果您能提供一个版本(如果您愿意可以剥离 - 我不想从您那里窃取商业想法)的APK,那就更好了,然后我可以在我们的其他手机上测试APK。
Johan,索尼爱立信开发者支持

@Johan - 我遇到了完全相同的问题 - 联系你的最佳方式是什么? - Jan Berkel
我已经离线了一段时间。抱歉。请联系semcabris@gmail.com - Johan Abramsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接