html5 video调用servlet播放

116 篇文章 0 订阅

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

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值