Я пытаюсь транслировать видео с сервера на клиент, но шифрую его при передаче.
Сейчас я не уверен, как расшифровать поток перед подачей в качестве исходного кода для 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>