Tl; Dr - คำถาม:
วิธีที่ถูกต้องในการจัดการการสตรีมไฟล์วิดีโอไปยังเครื่องเล่นวิดีโอ html5 ด้วย Node.js คืออะไรเพื่อให้การควบคุมวิดีโอทำงานต่อไป
ฉันคิดว่ามันเกี่ยวข้องกับวิธีจัดการส่วนหัว อย่างไรก็ตามนี่คือข้อมูลพื้นฐาน รหัสมีความยาวเล็กน้อยแต่ค่อนข้างตรงไปตรงมา
การสตรีมไฟล์วิดีโอขนาดเล็กไปยังวิดีโอ HTML5 ด้วย Node เป็นเรื่องง่าย
ฉันเรียนรู้วิธีการสตรีมไฟล์วิดีโอขนาดเล็กไปยังเครื่องเล่นวิดีโอ HTML5 ได้อย่างง่ายดาย ด้วยการตั้งค่านี้การควบคุมจะทำงานโดยไม่ต้องทำงานใด ๆ ในส่วนของฉันและวิดีโอสตรีมได้อย่างไม่มีที่ติ สำเนาการทำงานของรหัสที่ทำงานอย่างเต็มที่กับวิดีโอตัวอย่างที่นี่สำหรับการดาวน์โหลดบน Google Docs
ลูกค้า:
<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()
รหัสนั้นไว้แสดงความคิดเห็น แต่ในกรณีนี้จะช่วย ฉันควรลบข้อมูลนั้นออกเพื่อให้ข้อมูลโค้ดอ่านง่ายขึ้นหรือไม่