Node.js
Invio di un flusso di file al client
Ricerca…
Utilizzo di fs And pipe per il flusso di file statici dal server
Un buon servizio VOD (Video On Demand) dovrebbe iniziare con le basi. Diciamo che hai una directory sul tuo server che non è pubblicamente accessibile, ma attraverso una sorta di portale o paywall vuoi consentire agli utenti di accedere ai tuoi file multimediali.
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 });
});
Il frammento di cui sopra è uno schema di base per il modo in cui desideri trasmettere il tuo video in streaming a un cliente. La logica del blocco dipende da una varietà di fattori, tra cui il traffico di rete e la latenza. È importante bilanciare le dimensioni del mandrino rispetto alla quantità.
Infine, la chiamata .pipe consente a node.js di mantenere aperta una connessione con il server e di inviare chunk aggiuntivi, se necessario.
Streaming Utilizzando fluent-ffmpeg
Puoi anche usare flent-ffmpeg per convertire i file .mp4 in file .flv o altri tipi:
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 });