我正在尝试将视频从服务器流传输到客户端,但在传输过程中将其加密。
现在,我不确定在将其作为客户端上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>