Node.js
Envoi d'un flux de fichiers au client
Recherche…
Utiliser fs et pipe Pour diffuser des fichiers statiques à partir du serveur
Un bon service VOD (Video On Demand) devrait commencer avec les bases. Disons que vous avez un répertoire sur votre serveur qui n'est pas accessible au public, mais par le biais d'une sorte de portail ou de paywall que vous souhaitez autoriser les utilisateurs à accéder à vos médias.
var movie = path.resolve('./public/' + req.params.filename);
fs.stat(movie, function (err, stats) {
var range = req.headers.range;
if (!range) {
return res.sendStatus(416);
}
//Chunk logic here
var positions = range.replace(/bytes=/, "").split("-");
var start = parseInt(positions[0], 10);
var total = stats.size;
var end = positions[1] ? parseInt(positions[1], 10) : total - 1;
var chunksize = (end - start) + 1;
res.writeHead(206, {
'Transfer-Encoding': 'chunked',
"Content-Range": "bytes " + start + "-" + end + "/" + total,
"Accept-Ranges": "bytes",
"Content-Length": chunksize,
"Content-Type": mime.lookup(req.params.filename)
});
var stream = fs.createReadStream(movie, { start: start, end: end, autoClose: true })
.on('end', function () {
console.log('Stream Done');
})
.on("error", function (err) {
res.end(err);
})
.pipe(res, { end: true });
});
L'extrait ci-dessus est une description de base de la manière dont vous souhaitez diffuser votre vidéo sur un client. La logique de segment dépend de divers facteurs, notamment du trafic réseau et de la latence. Il est important d'équilibrer la taille du mandrin par la quantité.
Enfin, l’appel .pipe permet à node.js de garder une connexion ouverte avec le serveur et d’envoyer des blocs supplémentaires si nécessaire.
Streaming Utilisation de ffmpeg fluide
Vous pouvez également utiliser flent-ffmpeg pour convertir des fichiers .mp4 en fichiers .flv ou d'autres types:
res.contentType ('flv');
var pathToMovie = './public/' + req.params.filename;
var proc = ffmpeg(pathToMovie)
.preset('flashvideo')
.on('end', function () {
console.log('Stream Done');
})
.on('error', function (err) {
console.log('an error happened: ' + err.message);
res.send(err.message);
})
.pipe(res, { end: true });