De la diffusion d'un fichier vidéo dans un lecteur vidéo html5 avec Node.js de sorte que les commandes vidéo de continuer à travailler?

Tl;Dr - La Question:

Quelle est la bonne façon de gérer la diffusion d'un fichier vidéo dans un lecteur vidéo html5 avec Node.js de sorte que les commandes vidéo de continuer à travailler?

Je pense il a à voir avec la façon dont les en-têtes sont traitées. De toute façon, voici les informations d'arrière-plan. Le code est un peu longue, cependant, c'est assez simple.

Streaming petite vidéo fichiers vidéo HTML5 avec Nœud est facile

J'ai appris comment diffuser de petits fichiers vidéo d'un lecteur vidéo HTML5 très facilement. Avec cette configuration, les commandes fonctionnent sans aucun effort de ma part, et le flux vidéo à la perfection. Une copie de travail du code du travail avec l'exemple de la vidéo est ici, pour télécharger sur Google Docs.

Client:

<html>
  <title>Welcome</title>
    <body>
      <video controls>
        <source src="movie.mp4" type="video/mp4"/>
        <source src="movie.webm" type="video/webm"/>
        <source src="movie.ogg" type="video/ogg"/>
        <!-- fallback -->
        Your browser does not support the <code>video</code> element.
    </video>
  </body>
</html>

Serveur:

//Declare Vars & Read Files
var fs = require('fs'),
http = require('http'),
url = require('url'),
path = require('path');
var movie_webm, movie_mp4, movie_ogg;
//... [snip] ... (Read index page)
fs.readFile(path.resolve(__dirname,"movie.mp4"), function (err, data) {
if (err) {
throw err;
}
movie_mp4 = data;
});
//... [snip] ... (Read two other formats for the video)
//Serve & Stream Video
http.createServer(function (req, res) {
//... [snip] ... (Serve client files)
var total;
if (reqResource == "/movie.mp4") {
total = movie_mp4.length;
}
//... [snip] ... handle two other formats for the video
var range = req.headers.range;
var positions = range.replace(/bytes=/, "").split("-");
var start = parseInt(positions[0], 10);
var end = positions[1] ? parseInt(positions[1], 10) : total - 1;
var chunksize = (end - start) + 1;
if (reqResource == "/movie.mp4") {
res.writeHead(206, {
"Content-Range": "bytes " + start + "-" + end + "/" + total,
"Accept-Ranges": "bytes",
"Content-Length": chunksize,
"Content-Type": "video/mp4"
});
res.end(movie_mp4.slice(start, end + 1), "binary");
}
//... [snip] ... handle two other formats for the video
}).listen(8888);

Mais cette méthode est limitée aux fichiers < 1 go en taille.

Streaming (de toute taille) des fichiers vidéo avec fs.createReadStream

En utilisant fs.createReadStream(), le serveur peut lire le fichier dans un flux plutôt que de lire tout cela en mémoire à la fois. Cela ressemble à la bonne façon de faire les choses, et la syntaxe est très simple:

Serveur Extrait De:

movieStream = fs.createReadStream(pathToFile);
movieStream.on('open', function () {
res.writeHead(206, {
"Content-Range": "bytes " + start + "-" + end + "/" + total,
"Accept-Ranges": "bytes",
"Content-Length": chunksize,
"Content-Type": "video/mp4"
});
//This just pipes the read stream to the response object (which goes 
//to the client)
movieStream.pipe(res);
});
movieStream.on('error', function (err) {
res.end(err);
});

Ce flux de la vidéo il suffit de bien! Mais la vidéo, les contrôles ne fonctionnent plus.

  • J'ai quitté la writeHead() code commenté, mais là au cas où ça aide. Dois-je le supprimer que de faire de l'extrait de code plus lisible?
  • d'où vient req.les en-têtes.gamme viennent de? Je reçois pas défini lorsque j'essaie de faire le remplacement de la méthode. Merci.