Node js加密视频流

时间:2020-05-02 23:32:55

标签: javascript node.js encryption video-streaming node-streams

我正在尝试将视频从服务器流传输到客户端,但在传输过程中将其加密。

现在,我不确定在将其作为客户端上html视频的源代码输入之前如何解密流。

如果我删除.pipe(encrypt),流将起作用,并且我知道我需要对客户端上的数据进行解密,但是我不知道如何从服务器中获取管道,对其进行解密和然后将其用作视频的src。

服务器:

const express = require("express");
const app = express();
const fs = require("fs");
const helmet = require("helmet");
const crypto = require("crypto");
const algorithm = "aes-256-ctr";
const password = "d6F3Efeq";

var encrypt = crypto.createCipher(algorithm, password);

const port = process.env.PORT || 3000;
app.use(helmet());
app.use(express.static("public"));

app.get("/stream", (req, res) => {
  console.log("Stream requested");
  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(encrypt).pipe(res);
  } else {
    const head = {
      "Content-Length": fileSize,
      "COntent-Type": "video/mp4",
    };
    res.writeHead(200, head);
    fs.createReadStream(path).pipe(encrypt).pipe(res);
  }
});

app.listen(port, () => console.log(`Listening on port ${port}`));

客户端html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Stream</title>
  </head>
  <body>
    <video src="./stream" controls></video>
  </body>
</html>

0 个答案:

没有答案