Node js зашифрованный видеопоток - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь транслировать видео с сервера на клиент, но шифрую его при передаче.

Сейчас я не уверен, как расшифровать поток перед подачей в качестве исходного кода для html видео на клиенте.

Если я удаляю поток .pipe(encrypt) работает, и я знаю, что мне нужно дешифровать данные на клиенте, но я не знаю, как я могу получить канал с сервера, дешифровать его, а затем использовать его в качестве sr c для видео.

Сервер:

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>
...