Sök…


Använda fs och pipe för att strömma statiska filer från servern

En bra VOD-tjänst (Video On Demand) bör börja med grunderna. Låt oss säga att du har en katalog på din server som inte är allmänt tillgänglig, men genom någon form av portal eller betalvägg vill du låta användare komma åt dina media.

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 });

        });

Utdraget ovan är en grundläggande beskrivning för hur du vill strömma din video till en klient. Storlekslogiken beror på olika faktorer, inklusive nätverkstrafik och latens. Det är viktigt att balansera chuckstorlek kontra kvantitet.

Slutligen låter .pipe-samtalet node.js veta att hålla en anslutning öppen med servern och skicka ytterligare bitar efter behov.

Streaming med flytande-ffmpeg

Du kan också använda flent-ffmpeg för att konvertera .mp4-filer till .flv-filer eller andra typer:

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 }); 


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow