Giới thiệu về streaming và vai trò của Node.js
Trong thế giới số hiện nay, streaming video và audio đã trở thành một phần không thể thiếu của trải nghiệm trực tuyến. Từ xem phim, nghe nhạc, livestream, đến hội nghị truyền hình, khả năng truyền tải nội dung đa phương tiện theo thời gian thực là yếu tố then chốt. Node.js, với khả năng xử lý bất đồng bộ mạnh mẽ và hệ sinh thái phong phú, là một lựa chọn đáng cân nhắc cho việc xây dựng các ứng dụng streaming.
Tại sao Node.js phù hợp cho streaming?
Node.js được thiết kế để xử lý đồng thời nhiều kết nối với hiệu năng cao, nhờ mô hình event-driven và non-blocking I/O. Điều này giúp nó có thể quản lý hàng ngàn luồng dữ liệu streaming cùng lúc mà không làm quá tải hệ thống. Ngoài ra, hệ sinh thái npm cung cấp nhiều thư viện hỗ trợ streaming như express, socket.io, fluent-ffmpeg, hay các công cụ mã hóa và chuyển đổi định dạng media.
Các khái niệm cơ bản trong streaming
Trước khi đi sâu vào code, cần hiểu rõ một số khái niệm:
– Buffering: Tạm lưu trữ dữ liệu trước khi phát để đảm bảo trải nghiệm mượt mà.
– Adaptive bitrate streaming: Điều chỉnh chất lượng video/audio dựa trên băng thông của người dùng.
– Protocols: HTTP, RTMP, HLS, DASH là những giao thức phổ biến cho streaming.
Node.js có thể làm việc với cả HTTP thông thường lẫn các giao thức chuyên biệt, giúp tối ưu hóa trải nghiệm người dùng.
Xây dựng ứng dụng streaming đơn giản với Node.js
Streaming video/audio qua HTTP
Một trong những cách đơn giản nhất là sử dụng Express để stream file media. Ví dụ:
const express = require('express');
const fs = require('fs');
const app = express();
app.get('/video', (req, res) => {
const path = 'video.mp4';
const stat = fs.statSync(path);
const fileSize = stat.size;
const range = req.headers.range;
if (range) {
const parts = range.replace(/bytes=/, "").split("-");
const start = parseInt(parts[0], 10);
const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1;
const chunksize = (end - start) + 1;
const file = fs.createReadStream(path, { start, end });
const head = {
'Content-Range': bytes ${start}-${end}/${fileSize},
'Accept-Ranges': 'bytes',
'Content-Length': chunksize,
'Content-Type': 'video/mp4'
};
res.writeHead(206, head);
file.pipe(res);
} else {
const head = {
'Content-Length': fileSize,
'Content-Type': 'video/mp4'
};
res.writeHead(200, head);
fs.createReadStream(path).pipe(res);
}
});
app.listen(3000, () => console.log('Server running on port 3000'));
Đoạn code trên cho phép client yêu cầu từng phần của file video, giúp tiết kiệm băng thông và hỗ trợ tính năng tua nhanh, tua lại.
Streaming với HLS (HTTP Live Streaming)
HLS là chuẩn phổ biến cho streaming trên web và di động. Node.js có thể phối hợp với ffmpeg để tự động tạo các file .m3u8 và segment video:
const ffmpeg = require('fluent-ffmpeg');
const fs = require('fs');
ffmpeg('input.mp4')
.output('output.m3u8')
.outputOptions([
'-hls_list_size 0',
'-hls_time 10'
])
.on('end', () => {
console.log('HLS segments created');
})
.run();