原生node返回视频文件流,实现视频播放。

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')
})

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js 提供了原生的 HTTP 模块,可以用它来创建一个 HTTP 服务器。以下是一个简单的例子: ```javascript const http = require('http'); const fs = require('fs'); const server = http.createServer((req, res) => { // 设置响应头 res.setHeader("Content-Type", "text/html; charset=utf-8"); if (req.url === '/') { // 读取文件 fs.readFile('./index.html', (err, data) => { if (err) { res.statusCode = 500; res.end("Internal Server Error"); return; } res.end(data); }); } else { res.statusCode = 404; res.end("Not Found"); } }); server.listen(8080, () => { console.log("Server is listening on port 8080"); }); ``` 这个例子中,我们使用 Node.js 自带的 http 模块创建了一个 HTTP 服务器,并且在端口 8080 上进行监听。当客户端请求根目录时,服务器会读取当前目录下的 `index.html` 文件返回给客户端。如果请求的是其他路径,则返回一个 404 错误。 如果你想创建一个文件服务器,可以使用 Node.js 自带的 `fs` 模块来读取文件返回给客户端,以下是一个简单的例子: ```javascript const http = require('http'); const fs = require('fs'); const server = http.createServer((req, res) => { // 获取文件路径 const filePath = req.url.slice(1); // 读取文件 fs.readFile(filePath, (err, data) => { if (err) { res.statusCode = 500; res.end("Internal Server Error"); return; } // 设置响应头 res.setHeader("Content-Type", "text/plain; charset=utf-8"); // 返回文件内容 res.end(data); }); }); server.listen(8080, () => { console.log("Server is listening on port 8080"); }); ``` 这个例子中,我们使用 `req.url` 获取客户端请求的文件路径,并使用 `fs` 模块读取文件内容,然后将文件内容返回给客户端。注意,这个例子没有对文件路径进行安全性检查,因此可能存在安全漏洞,建议在生产环境中使用更完善的安全措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值