当前位置: 代码迷 >> Java Web开发 >> 音乐播放,该如何处理
  详细解决方案

音乐播放,该如何处理

热度:80   发布时间:2016-04-16 21:42:35.0
音乐播放
本帖最后由 kanbe_kotori 于 2014-11-10 13:59:13 编辑
在写一个基于web的音乐播放器,现在测试是直接用chrome访问我的mp3地址,如果我的servlet只返回mp3数据的话,没办法快进,加了一些返回的head后,可以快进了。
现在出现这么个现象:
现象1:在chrome里访问这个servlet,音乐自动开始播放,等他播放了一会儿后,往左边的进度条点击进,浏览器console显示第一个请求中断,重新发出另一个请求,但新的请求也会立即中断,后台是两个异常:ClientAbortException pipe broken。

现象2:和1一样,但这次是用拖的方式往左拖,没事,可以继续播放,不会有重新请求现象。
现象3:在chrome里访问这个servlet,音乐自动开始播放,然后往右边的进度条点击,可以播放,并且播放的是点击后的进度条的那个时间的音乐,然后再往左边的进度条点击,就又出现现象1所说的那个问题了。

@WebServlet("/mp3")
public class Mp3Servlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletExceptionIOException {

Enumeration<String> en = req.getHeaderNames();
while(en.hasMoreElements()) {
String name = en.nextElement();
System.out.println(name + ": " + req.getHeader(name));
}
System.out.println("----------------------------------------------");
Path path = Paths.get("/Users/jiangxingshang/Documents/workspace/eclipse/MyMusic/my-music/src/main/webapp/assets/sound/1.mp3");
try (
ReadableByteChannel input = Channels.newChannel(Files.newInputStream(path, StandardOpenOption.READ));
WritableByteChannel output = Channels.newChannel(resp.getOutputStream())) {
int len = (int)Files.size(path);
resp.addHeader("Accept-Ranges", "bytes");//不加这个没办法拖动进度条
resp.addHeader("Connection", "keep-alive");
resp.addHeader("Cache-Control", "no-cache");//不加这个会出现,点击暂停,然后再播放就出现ClientAbortException,加了后没事
resp.addHeader("Content-Encoding", "utf-8");
resp.addHeader("ETag", "\"592B24F5B70D3608A075E530CDABE190\"");
resp.addHeader("Keep-Alive", "timeout=2, max=100");
resp.addDateHeader("Last-Modified", Files.getLastModifiedTime(path, LinkOption.NOFOLLOW_LINKS).toMillis());
resp.setContentType("audio/mpeg");
resp.setContentLength(len);
ByteBuffer bb = ByteBuffer.allocate(2048);

while(input.read(bb) != -1) {
bb.flip();
output.write(bb);
bb.clear();
}
} catch(Exception e) {
e.printStackTrace();
}
}
}


我看了百度音乐和虾米音乐的请求,返回的head也差不多是这样,现在不知道是什么问题。以上的测试我也用一个js的音乐播放器(soundmanager2)测试过,也是这种情况。
------解决思路----------------------
帮顶   我也不知道为什么
------解决思路----------------------
用HTTP Analyzer监控Request与Response;多分析分析看看。
------解决思路----------------------
如果跨浏览器音乐播放你打算怎么解决啊?
------解决思路----------------------
问题解决了,那就结帖吧。
  相关解决方案