java支持html5视频流技术Pseudostreaming http://www.itdadao.com/articles/c15a144929p0.html
html5 video调用servlet播放 http://www.what21.com/programming/java/javaweb-summary/html5_video_servlet.html
Tomcat下Servlet传输视频流 http://www.voidcn.com/blog/acmersch/article/p-2940644.html
1. HTML5的Video标签
<video> 标签定义视频,可以播放任何电影片段或其他视频流。
1 2 3 4 5 |
<video width="100%" height="100%" controls="controls"> <source src="<%=path %>/video.action" type="video/ogg" /> <source src="<%=path %>/video.action" type="video/mp4" /> 您的浏览器不支持 video 标签。 </video> |
2. Video播放调用Servlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
package net.ultratool; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author ultratool */ public class VideoStreamServlet extends HttpServlet { private static final long serialVersionUID = 6948918204420124894L; @Override protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { // 取头参数 String range = request.getHeader("range"); String browser = request.getHeader("User-Agent"); if (browser.indexOf("Firefox") != -1) { // 火狐浏览器 byte[] data = getBytesFromFile(new File("C:/media/final.ogg")); response.setContentType("video/ogg"); response.setContentLength(data.length); response.setHeader("Content-Range", range + Integer.valueOf(data.length - 1)); response.setHeader("Accept-Ranges", "bytes"); response.setHeader("Etag", "W/\"9767057-1323779115364\""); byte[] content = new byte[1024]; BufferedInputStream is = new BufferedInputStream(new ByteArrayInputStream(data)); response.reset(); OutputStream os = response.getOutputStream(); while (is.read(content) != -1) { os.write(content); } is.close(); os.close(); } else if (browser.indexOf("MSIE") != -1) { // IE9以上浏览器 byte[] data = getBytesFromFile(new File("C:/media/final.mp4")); String diskfilename = "final.mp4"; response.setContentType("video/mpeg"); // response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"" + diskfilename + "\""); response.setContentLength(data.length); response.setHeader("Content-Range", range + Integer.valueOf(data.length - 1)); response.setHeader("Accept-Ranges", "text/x-dvi"); response.setHeader("Etag", "W/\"9767057-1323779115364\""); byte[] content = new byte[1024]; BufferedInputStream is = new BufferedInputStream(new ByteArrayInputStream(data)); response.reset(); OutputStream os = response.getOutputStream(); while (is.read(content) != -1) { os.write(content); } is.close(); os.close(); } else if (browser.indexOf("Chrome") != -1) { // 谷歌浏览器 byte[] data = getBytesFromFile(new File("C:/media/final.mp4")); String diskfilename = "final.mp4"; response.setContentType("video/mp4"); // response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"" + diskfilename + "\""); System.out.println("data.length " + data.length); response.setContentLength(data.length); response.setHeader("Content-Range", range + Integer.valueOf(data.length - 1)); response.setHeader("Accept-Ranges", "bytes"); response.setHeader("Etag", "W/\"9767057-1323779115364\""); byte[] content = new byte[1024]; BufferedInputStream is = new BufferedInputStream(new ByteArrayInputStream(data)); response.reset(); OutputStream os = response.getOutputStream(); while (is.read(content) != -1) { os.write(content); } is.close(); os.close(); } else if (browser.indexOf("CoreMedia") != -1) { // 其他浏览器 byte[] data = getBytesFromFile(new File("D:/media/final.mp4")); String diskfilename = "final.mp4"; response.setContentType("video/mpeg"); response.setHeader("Content-Disposition", "attachment; filename=\"" + diskfilename + "\""); byte[] content = new byte[1024]; BufferedInputStream is = new BufferedInputStream(new ByteArrayInputStream(data)); response.reset(); OutputStream os = response.getOutputStream(); while (is.read(content) != -1) { os.write(content); } is.close(); os.close(); } } /** * 读取文件字节 * * @param file * @return * @throws IOException */ private static byte[] getBytesFromFile(File file) throws IOException { InputStream is = new FileInputStream(file); long length = file.length(); if (length > Integer.MAX_VALUE) { return null; } byte[] bytes = new byte[(int) length]; int offset = 0; int numRead = 0; while ((offset < bytes.length) && ((numRead = is.read(bytes, offset, bytes.length - offset)) >= 0)) { offset += numRead; } if (offset < bytes.length) { throw new IOException("Could not completely read file " + file.getName()); } is.close(); return bytes; } } |