Tl; Tiến sĩ - Câu hỏi:
Đâu là cách phù hợp để xử lý việc truyền tệp video sang trình phát video html5 với Node.js để các điều khiển video tiếp tục hoạt động là gì?
Tôi nghĩ nó liên quan đến cách xử lý các tiêu đề. Dù sao, đây là thông tin cơ bản. Mã là mộtTuy nhiên, hơi dài dòng.
Dễ dàng truyền trực tuyến các tệp video nhỏ sang video HTML5 với Node
Tôi đã học cách truyền các tệp video nhỏ sang trình phát video HTML5 rất dễ dàng. Với thiết lập này, các điều khiển hoạt động mà không cần bất kỳ công việc nào của tôi và video phát trực tuyến hoàn hảo. Tại đây có một bản sao hoạt động của mã làm việc đầy đủ với video mẫu để tải xuống trên Google Tài liệu .
Khách hàng:
<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>
Người phục vụ:
// 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);
Nhưng phương pháp này được giới hạn cho các tệp có kích thước <1GB.
Truyền trực tuyến các tệp video (kích thước bất kỳ) với fs.createReadStream
Bằng cách sử dụng fs.createReadStream()
, máy chủ có thể đọc tệp trong một luồng thay vì đọc tất cả vào bộ nhớ cùng một lúc. Điều này nghe có vẻ như là một cách đúng đắn để thực hiện mọi việc và cú pháp cực kỳ đơn giản:
Đoạn mã máy chủ:
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);
});
Điều này phát trực tuyến video tốt! Nhưng các điều khiển video không còn hoạt động.
writeHead()
mã đó bình luận, nhưng ở đó trong trường hợp nó hữu ích. Tôi có nên xóa điều đó để làm cho đoạn mã dễ đọc hơn không?