HTML 部分:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>播放器</title>
</head>
<body>
<div>俺是播放器</div>
<video src="http://localhost:8083/video" width="500" controls></video>
</body>
</html>
Node 部分:
const fs = require('fs')
const path = require('path')
const http = require('http')
const { stat } = require('fs').promises
const indexPath = path.join(__dirname, 'index.html')
const videoPath = path.join(__dirname, 'video', 'demo_video.mp4')
const server = http.createServer(async (req, res) => {
const { url } = req
if (url == '/') {
res.writeHead(200, { 'Content-Type': 'text/html;charset=UTF-8' })
res.write(fs.readFileSync(indexPath))
}
if (url == '/video') {
let range = req.headers['range']
if (range) {
let stats = await stat(videoPath)
let r = range.match(/=(\d+)-(\d+)?/)
let start = parseInt(r[1], 10)
let end = r[2] ? parseInt(r[2], 10) : start + 1024 * 1024
if (end > stats.size - 1) end = stats.size - 1
const head = {
'Content-Type': 'video/mp4',
'Content-Range': `bytes ${start}-${end}/${stats.size}`,
'Content-Length': end - start + 1,
'Accept-Ranges': 'byte',
}
res.writeHead(206, head)
fs.createReadStream(videoPath, { start, end }).pipe(res)
} else {
fs.createReadStream(videoPath).pipe(res)
}
}
})
server.listen(8083, () => {
console.log('server start')
})