Node.js
Enviando un flujo de archivos al cliente
Buscar..
Uso de fs y pipe para transmitir archivos estáticos desde el servidor
Un buen servicio de VOD (Video On Demand) debe comenzar con lo básico. Digamos que tiene un directorio en su servidor al que no se puede acceder públicamente, pero a través de algún tipo de portal o muro de pago desea que los usuarios accedan a sus medios.
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 });
});
El fragmento anterior es un resumen básico de cómo le gustaría transmitir su video a un cliente. La lógica del fragmento depende de una variedad de factores, incluido el tráfico de red y la latencia. Es importante equilibrar el tamaño del mandril frente a la cantidad.
Finalmente, la llamada .pipe le permite a node.js mantener una conexión abierta con el servidor y enviar fragmentos adicionales según sea necesario.
Streaming Utilizando fluent-ffmpeg
También puede usar flent-ffmpeg para convertir archivos .mp4 a archivos .flv u otros tipos:
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 });