[英]video is not streaming when piped to a middle stream
我想使用node.js
创建一个具有使用情况统计的基本视频流服务器,视频源是本地文件。 流媒体按预期工作:
fs.createReadStream("file.mp4").pipe(res);
但是我想得到一些使用统计,所以我添加了一个passThrough
stream,
const stats = new PassThrough();
对于统计数据,我将向stats
stream 数据事件添加一些代码,如下所示//stats.on('data',(chunk)=> { });
但是现在当我将 pipe 发送到统计数据 stream 时,视频不再流式传输
fs.createReadStream("file.mp4").pipe(stats).pipe(res);
你能告诉我我在这里缺少什么吗?
仍然无法弄清楚如何将 stats 放在中间 stream 并在 res 上接收视频 stream,但是,一种可能的解决方案是将 stats 事件侦听器移动到 readStream ,如下所示:
const { createReadStream, stat } = require("fs");
const { promisify } = require("util");
const fileInfo = promisify(stat);
const { size } = await fileInfo(filePath);
const { range } = req.headers;
let start = 0;
let end = size - 1;
if (range) {
start = range.replace(/bytes=/, "").split("-")[0];
start = parseInt(start, 10);
end = range.replace(/bytes=/, "").split("-")[1];
end = end ? parseInt(end, 10) : size - 1;
res.writeHead(206, {
"Content-Range": `bytes ${start}-${end}/${size}`,
"Accept-Ranges": "bytes",
"Content-Length": end - start + 1,
"Content-Type": "video/mp4",
});
logUpdate("range:", range);
} else {
res.writeHeader(200, {
"Content-Type": "video/mp4",
"Content-Length": size,
});
}
createReadStream(filePath, { start, end })
.on("data", dataEventHandler)
.on("error", errorEventHandler)
.on("close", closeEventHandler)
.on("end", endEventHandler)
.pipe(res);
dataEventHandler = (chunk) => {
total += chunk.length;
logUpdate("bytes: ", total);
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.