Vidéo à l'Aide de HTML 5 et de servlet
Code donné ci-dessous est pour le streaming vidéo. Ce qui est bien avec IE9 et firefox, mais il n'est pas très bien avec Chrome et Safari pour Mac.
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;
}
}
Quelques remarques: ce que vous faites n'est pas le "streaming", vous avez juste à servir les fichiers via HTTP, comme toutes les autres; la gestion des différents navigateurs au niveau du serveur est une très mauvaise idée (et en général il faut le faire aussi peu que possible); vous ne devez séparer les 2-3 lignes qui diffèrent pour chaque cas, au lieu de répliquer tout le code.
OriginalL'auteur The Reader | 2011-12-21
Vous devez vous connecter pour publier un commentaire.
Honnêtement, cette approche n'est absolument pas le droit.
Vous renifler l'agent de l'utilisateur dans le serveur et en fonction de l'entreprise. C'est en tous cas une mauvaise idée. Si vous souhaitez spécifier un autre fichier en fonction de l'agent de l'utilisateur, au lieu de le faire dans le code HTML de côté, avec l'aide de JavaScript ou CSS. À la fois côté client, les langues sont en mesure d'identifier le réel navigateur, sans le besoin de renifler de la chaîne de l'agent utilisateur (qui est à savoir spoofable).
Vous ne répondez pas correctement sur
Range
demandes. Vous envoyez le dossier complet au lieu de la demandeRange
. Firefox et IE n'utilisez pas les demandes de plage et c'est pourquoi il "fonctionne". Chrome et Safari utiliser les demandes de plage.Cela devrait être possible, sans renifler l'agent de l'utilisateur et de répondre adéquatement aux
Range
demandes parRandomAccessFile
au lieu deFile
etbyte[]
. C'est seulement assez beaucoup de code pour prendre toutes Spécification HTTP en compte les exigences, donc voici un lien où vous pouvez trouver un exemple concret d'un tel servlet: FileServlet soutenant la reprise et la mise en cache.Cependant, beaucoup mieux, c'est de déléguer le travail à l'servletcontainer par défaut de servlet. Si c'est par exemple Tomcat, puis tout ce que vous devez faire est d'ajouter la ligne suivante à
/conf/server.xml
:De cette façon, les fichiers multimédias souhaités sont uniquement disponibles par http://localhost:8080/media/final.ogg et http://localhost:8080/media/final.mp4 sans la nécessité de homegrow une servlet.
Pour le tomcat contexte de l'approche: Est-il un moyen de mettre en œuvre un filtre de requête pour les fichiers multimédia?
OriginalL'auteur BalusC
Ce qui semble être de plus d'un format de problème de prise en charge.
Vous pouvez essayer le format ogg. Le code HTML5 est
OriginalL'auteur testndtv
Google Chrome ne prend pas en charge H. 264 (comprend mp4), alors vous avez besoin pour l'utilisation finale.ogg avec google chrome. alors que pour safari, vous aurez besoin de changer cette ligne
ajouter "Safari" au lieu de "CoreMedia"
j'espère que cela fonctionne.
OriginalL'auteur Kashif Khan
Juste un commentaire de ces deux lignes et ensuite l'exécuter sur chrome votre vidéo sera lue.
OriginalL'auteur amol