http://www.what21.com/programming/java/javaweb-summary/html5_video_servlet.html
1. HTML5的Video标签
<video> 标签定义视频,可以播放任何电影片段或其他视频流。<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
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));
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));
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));
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));
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;
}
}