我想从仅在临时时间内有效的URL播放音频流.由于存在缓冲机制,仅通过使用内置的stagefright流功能不能很好地发挥作用(URL将在第二次填充缓冲区时死掉),所以我实现了一个代理流,类似于在npr应用中完成了什么
这实际上非常好用,除了一个例外,任何寻求调用都会有效地中断代理流.我很难确定寻觅在舞台表演中的工作方式.每当我寻找时,我都会收到一条消息
01-12 13:35:57.201: ERROR/(4870): Connection reset by peer
01-12 13:35:57.201: ERROR/(4870): java.net.socketException: Connection reset by peer
01-12 13:35:57.201: ERROR/(4870): at org.apache.harmony.luni.platform.OSNetworkSystem.writeSocketImpl(Native Method)
01-12 13:35:57.201: ERROR/(4870): at org.apache.harmony.luni.platform.OSNetworkSystem.write(OSNetworkSystem.java:723)
01-12 13:35:57.201: ERROR/(4870): at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:578)
01-12 13:35:57.201: ERROR/(4870): at org.apache.harmony.luni.net.socketoutputStream.write(SocketoutputStream.java:59)
01-12 13:35:57.201: ERROR/(4870): at com.soundcloud.utils.StreamProxy.processRequest(StreamProxy.java:209)
然后停顿几秒钟,然后stagefright重试以连接到相同的URL,通常会引发错误(我想是因为未重置代理流).另一个潜在的问题是,代理流似乎总是会线性读取数据源:
while (isRunning && (readBytes = data.read(buff, 0, buff.length)) != -1)
我只是在猜测,但我认为为了支持查找,代理从缓冲区读取时必须能够提供偏移量.有没有办法找出从套接字客户端请求的偏移量(预期的查找位置)?
解决方法:
MediaPlayer正在发出HTTP范围请求,该请求指定播放器期望的字节偏移量.您可以从提交给代理服务器的请求的标头中读取这些范围值.然后,您可以打开仅将这些范围发送回MediaPlayer.