node播放视频流

import http from "http";
import url from "url";
import util from "util";
import qs from "querystring";
import fs from "fs";

// 默认GET方法响应
const server1 = http.createServer(function(req, res){
  res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
  res.end(util.inspect(url.parse(req.url, true)));
});

// 启用服务1
// server1.listen(3000);

// POST方法
const postHTML = 
  '<html><head><meta charset="utf-8"><title>Node Post表单提交</title></head>' +
  '<body>' +
  '<form method="post" action="/register/submit">' +
  '姓名: <input name="name"><br>' +
  '年龄: <input name="age"><br>' +
  '<input type="submit">' +
  '</form>' +
  '</body></html>';
const videoHTML = '<html><head><meta charset="utf-8"><title>Node Post表单提交</title></head>' +
  '<video muted controls autoplay="autoplay" preload="auto"><source src="/video/play"></source>您的浏览器不支持video标签</video>' +
  '</body></html>'
const server2 = http.createServer(function(req, res){
  // 申明变量data用于保存获取到的data
  let data = '';
  // 监听data获取事件
  req.on('data', (chunk) => {
    data += chunk; // 转为字符串
  });
  // 接收完成调用事件
  req.on('end', () => {
    // 调用的接口
    const { pathname } = url.parse(req.url);
    const postData = qs.parse(data);
    console.log('-----request data-----', postData, pathname); // 转为JSON
    // 注册接口路由
    if (postData.name && postData.age && pathname === "/register/submit") {
      // 设置响应头部信息及编码
      res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
      res.write("姓名:" + postData.name);
      res.write("<br>");
      res.write("年龄:" + postData.age);
      res.write("<br>");
      res.write(`恭喜您注册成功,${postData.name}!`);
    }
    // 进入注册页面的接口路由
    if (pathname === "/register") {
      // 设置响应头部信息及编码
      res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
      res.write(postHTML);
    }
    // 打开视频播放页面
    if (pathname === "/vedio") {
      // 设置响应头部信息及编码
      res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
      res.write(videoHTML);
    }
    // 传输视频流
    if (pathname === "/video/play") {
      //使用pipe
      // fs.createReadStream('./assets/vedios/vedio.mov')
      //   .pipe(res);
      const path = "./assets/vedios/vedio.mov";
      let stat = fs.statSync(path);
      let fileSize = stat.size;
      let range = req.headers.range;
      console.log('-----文件大小-----', fileSize);
      console.log('-----头部范围-----', range);
      if (range) {
        //有range头才使用206状态码
        let parts = range.replace(/bytes=/, "").split("-");
        let start = parseInt(parts[0], 10);
        let end = parts[1] ? parseInt(parts[1], 10) : start + 999999;

        // end 在最后取值为 fileSize - 1 
        end = end > fileSize - 1 ? fileSize - 1 : end;

        let chunksize = (end - start) + 1;
        let file = fs.createReadStream(path, { start, end });
        let head = {
            'Content-Range': `bytes ${start}-${end}/${fileSize}`,
            'Accept-Ranges': 'bytes',
            'Content-Length': chunksize,
            'Content-Type': 'video/mov',
        };
        res.writeHead(206, head);
        console.log('========', end, fileSize);
        file.pipe(res);
      } else {
        let head = {
            'Content-Length': fileSize,
            'Content-Type': 'video/mov',
        };
        res.writeHead(200, head);
        fs.createReadStream(path).pipe(res);
      }
    }
  });
});

// 启用服务2
server2.listen(3000);

参考链接:Node.js发送视频流_嘿嘿-CSDN博客_nodejs 视频流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值