টিএল; ডাঃ - প্রশ্ন:
Node.js সহ এইচটিএমএল 5 ভিডিও প্লেয়ারে কোনও ভিডিও ফাইল স্ট্রিমিং হ্যান্ডেল করার সঠিক উপায়টি কী যাতে ভিডিও নিয়ন্ত্রণগুলি কাজ চালিয়ে যেতে পারে?
আমি মনে করি এটি শিরোনামগুলি যেভাবে পরিচালিত হয় তার সাথে এটি করতে হবে। যাইহোক, এখানে পটভূমি তথ্য। কোডটি কিছুটা লম্বা, তবে এটি বেশ সোজা।
নোড সহ HTML5 ভিডিওতে ছোট ভিডিও ফাইলগুলি স্ট্রিমিং করা সহজ
আমি কীভাবে খুব সহজেই এইচটিএমএল 5 ভিডিও প্লেয়ারে ছোট ভিডিও ফাইলগুলি স্ট্রিম করতে পারি তা শিখেছি। এই সেটআপটি দিয়ে, নিয়ন্ত্রণগুলি আমার পক্ষ থেকে কোনও কাজ ছাড়াই কাজ করে এবং ভিডিও নির্বিঘ্নে প্রবাহিত করে। গুগল ডক্সে ডাউনলোডের জন্য স্যাম্পল ভিডিও সহ পুরোপুরি কার্যকরী কোডের একটি ওয়ার্কিং কপি এখানে ।
ক্লায়েন্ট:
<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()
কোডটি মন্তব্য করে রেখেছি , তবে সেখানে যদি এটি সাহায্য করে। কোড স্নিপেটকে আরও পঠনযোগ্য করার জন্য আমি কি তা সরিয়ে ফেলতে পারি?