html5 video servlet,java - Video Using HTML 5 and servlet - Stack Overflow

该代码段展示了如何处理视频流以适应不同浏览器的兼容性问题,包括Firefox、Chrome、IE9和Mac Safari。针对每个浏览器,它设置不同的内容类型、内容范围和响应头来提供视频文件。主要涉及的视频格式为ogg和mp4。
摘要由CSDN通过智能技术生成

Below given code is for video streaming. This is fine with IE9 and firefox but it is not fine with Chrome and Mac Safari.

import java.io.*;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* Servlet implementation class VideoStreamServlet

*/

public class VideoStreamServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

/**

* Default constructor.

*/

public VideoStreamServlet() {

// TODO Auto-generated constructor stub

}

/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

String range = request.getHeader("range");

String browser = request.getHeader("User-Agent");

System.out.println(browser);

if(browser.indexOf("Firefox") != -1){

System.out.println("==========ITS FIREFOX=============");

byte[] data = getBytesFromFile(new File("D:/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) {

//System.out.println("... write bytes");

os.write(content);

}

is.close();

os.close();

}

else if(browser.indexOf("Chrome") != -1){

System.out.println("==========ITS Chrome=============");

byte[] data = getBytesFromFile(new File("D:/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) {

//System.out.println("... write bytes");

os.write(content);

}

is.close();

os.close();

}

else if(browser.indexOf("MSIE") != -1) {

System.out.println("==========ITS IE9=============");

byte[] data = getBytesFromFile(new File("D:/media/final.mp4"));

String diskfilename = "final.mp4";

response.setContentType("video/mpeg");

//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", "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) {

//System.out.println("... write bytes");

os.write(content);

}

is.close();

os.close();

}

else if( browser.indexOf("CoreMedia") != -1) {

System.out.println("============ Safari=============");

byte[] data = getBytesFromFile(new File("D:/media/final.mp4"));

String diskfilename = "final.mp4";

response.setContentType("video/mpeg");

//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", " text/*, text/html, text/html;level=1, */* ");

// 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) {

//System.out.println("... write bytes");

os.write(content);

}

is.close();

os.close();

}

}

/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

}

private static byte[] getBytesFromFile(File file) throws IOException {

InputStream is = new FileInputStream(file);

//System.out.println("\nDEBUG: FileInputStream is " + file);

// Get the size of the file

long length = file.length();

//System.out.println("DEBUG: Length of " + file + " is " + length + "\n");

/*

* You cannot create an array using a long type. It needs to be an int

* type. Before converting to an int type, check to ensure that file is

* not loarger than Integer.MAX_VALUE;

*/

if (length > Integer.MAX_VALUE) {

System.out.println("File is too large to process");

return null;

}

// Create the byte array to hold the data

byte[] bytes = new byte[(int)length];

// Read in the bytes

int offset = 0;

int numRead = 0;

while ( (offset < bytes.length)

&&

( (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) ) {

offset += numRead;

}

// Ensure all the bytes have been read in

if (offset < bytes.length) {

throw new IOException("Could not completely read file " + file.getName());

}

is.close();

return bytes;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值