我正在尝试从亚马逊的S3桶上播放视频。
如果我只调用REST端点一次,流就能正常工作。但是,如果我想同时从多个浏览器中传输视频,我会得到以下错误: TimeoutError:连接超时后120000ms
到目前为止我的代码是:
var express = require("express");
var fs = require("fs");
var app = express();
var path = require("path");
var AWS = require("aws-sdk");
app.get("/video", function(req, res, next) {
res.set({
"Accept-Ranges": "bytes",
"Content-Type": "video/mp4",
"Content-Length": 41811600,
"Cache-Control": "max-age=31536000"
});
var stream;
if (req.headers.range) {
const size = 41811600;
const parts = req.headers.range.replace(/bytes=/, "").split("-");
const start = parseInt(parts[0], 10);
const end = parts[1] ? parseInt(parts[1], 10) : size - 1;
const length = end - start + 1;
res.set({
"Content-Range": `bytes ${start}-${end}/${size}`,
"Content-Length": length
});
stream = getReadStream(start, end);
} else {
stream = getReadStream(undefined, undefined);
}
res.writeHead(res.getHeader("Content-Range") ? 206 : 200);
return stream.pipe(res);
});
function getReadStream(startByte, endByte) {
const params = {
Bucket: "s3-fancy-test-bucket",
Key: path.join(
"SOME_KEY"
),
Range: "bytes=" + (startByte || 0) + "-" + (endByte || "")
};
const stream = getS3Instance()
.getObject(params)
.createReadStream();
stream.on("error", err => {
console.error(`Unable to get File Stream for ${params.Key} - ${err}`);
});
return stream;
}
function getS3Instance() {
AWS.config.update({
accessKeyId: "ACCESS_KEY_ID",
secretAccessKey: "SECRET",
signatureVersion: "v4",
region: "eu-central-1"
});
return new AWS.S3({ apiVersion: "2006-03-01" });
}
app.listen(process.env.PORT || 3000);我不太确定这是的问题还是流的一般问题.
我做错了什么?有没有人遇到过同样的问题?
发布于 2018-05-02 13:47:00
同时,我发现,上面描述的行为在很大程度上取决于视频是如何创建的。我使用ffmpeg将视频转换为mp4。就范围请求的数量而言,使用faststart标志转换视频会产生很大的不同。一旦我设置了faststart标志,就会出现来自浏览器的范围更小的请求来加载视频。由于现在请求越来越少,express /aws似乎能够处理它。不再有超时时间了。
发布于 2021-06-19 07:50:30
我们正在尝试完全相同的事情,只是我们这样做的原因是,我们想要限制通过我们的后端访问视频,然后再将视频流给用户。因此,直接从s3提供视频并不是一种选择。我意识到视频流很好,但是即使在流成功结束之后,getObject()也会超时120000 ms(aws默认超时时间)。在aws存储库中,似乎存在一个尚未解决的问题。
https://stackoverflow.com/questions/49941587
复制相似问题