zoukankan      html  css  js  c++  java
  • node 实现视频播放后端,前端使用video标签,视频文件视频mp4

    var fs = require("fs"),
        http = require("http"),
        url = require("url"),
        path = require("path");
    
    http.createServer(function (req, res) {
      if (req.url != "/v") {
        res.writeHead(200, { "Content-Type": "text/html" });
        res.end('<video src="/v" controls></video>');
      } else {
        var file = path.resolve(__dirname,"111.mp4");
        fs.stat(file, function(err, stats) {
          if (err) {
            if (err.code === 'ENOENT') {
              // 404 Error if file not found
              return res.sendStatus(404);
            }
          res.end(err);
          }
          var range = req.headers.range;
          if (!range) {
           // 416 Wrong range
           return res.sendStatus(416);
          }
          var positions = range.replace(/bytes=/, "").split("-");
          var start = parseInt(positions[0], 10);
          var total = stats.size;
          var end = positions[1] ? parseInt(positions[1], 10) : total - 1;
          var chunksize = (end - start) + 1;
    
          res.writeHead(206, {
            "Content-Range": "bytes " + start + "-" + end + "/" + total,
            "Accept-Ranges": "bytes",
            "Content-Length": chunksize,
            "Content-Type": "video/mp4"
          });
    
          var stream = fs.createReadStream(file, { start: start, end: end })
            .on("open", function() {
              stream.pipe(res);
            }).on("error", function(err) {
              res.end(err);
            });
        });
      }
    }).listen(3001);
    

    实现的关键在于获取http的range标记,以及返回文件区间和文件区间相关标记。
    大部分是http的知识

  • 相关阅读:
    自己收集的一些伪元素/伪类
    ie9的placeholder不显示的解决办法(包含多个密码框)
    9.14上午
    9.13
    9.11笔记
    html基础英语单词
    选择器的分辨
    学习笔记
    RecyleView
    自定义view获取宽高
  • 原文地址:https://www.cnblogs.com/Silababy/p/6109743.html
Copyright © 2011-2022 走看看