टीएल; डॉ - प्रश्न:
Node.js के साथ एक वीडियो फ़ाइल को html5 वीडियो प्लेयर में स्ट्रीमिंग करने का सही तरीका क्या है ताकि वीडियो नियंत्रण काम करना जारी रखे?
मुझे लगता है कि हेडर को जिस तरह से हैंडल किया जाता है, उसके साथ ऐसा करना पड़ता है। वैसे भी, यहाँ पृष्ठभूमि की जानकारी है। कोड थोड़ा लंबा है, हालांकि, यह बहुत सीधा है।
नोड के साथ एचटीएमएल 5 वीडियो के लिए छोटी वीडियो फ़ाइलों को स्ट्रीम करना आसान है
मैंने सीख लिया कि छोटी वीडियो फ़ाइलों को एचटीएमएल 5 वीडियो प्लेयर में कैसे आसानी से स्ट्रीम किया जा सकता है। इस सेटअप के साथ, नियंत्रण मेरी ओर से बिना किसी काम के काम करता है, और वीडियो निर्दोष रूप से प्रवाहित होता है। Google डॉक्स पर डाउनलोड के लिए, नमूना वीडियो के साथ पूरी तरह से काम करने वाले कोड की एक कार्यशील प्रति यहां है ।
ग्राहक:
<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>
सर्वर:
// 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);
लेकिन यह विधि फाइलों में सीमित है <1GB आकार में।
स्ट्रीमिंग (किसी भी आकार) वीडियो फ़ाइलों के साथ fs.createReadStream
उपयोग करके fs.createReadStream()
, सर्वर फ़ाइल को एक बार में सभी मेमोरी में पढ़ने के बजाय एक स्ट्रीम में पढ़ सकता है। यह चीजों को करने का सही तरीका लगता है, और वाक्य रचना बेहद सरल है:
सर्वर स्निपेट:
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);
});
यह वीडियो को ठीक ठीक स्ट्रीम करता है! लेकिन वीडियो अब काम नहीं करता है।
writeHead()
कोड पर टिप्पणी की, लेकिन इसमें मदद मिलती है। क्या मुझे उस कोड स्निपेट को अधिक पठनीय बनाने के लिए निकालना चाहिए?