首页
学习
活动
专区
圈层
工具
发布

S3
EN

Stack Overflow用户
提问于 2018-04-20 12:23:33
回答 2查看 1.3K关注 0票数 0

我正在尝试从亚马逊的S3桶上播放视频。

如果我只调用REST端点一次,流就能正常工作。但是,如果我想同时从多个浏览器中传输视频,我会得到以下错误: TimeoutError:连接超时后120000ms

到目前为止我的代码是:

代码语言:javascript
复制
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);

我不太确定这是的问题还是流的一般问题.

我做错了什么?有没有人遇到过同样的问题?

EN

回答 2

Stack Overflow用户

发布于 2018-05-02 13:47:00

同时,我发现,上面描述的行为在很大程度上取决于视频是如何创建的。我使用ffmpeg将视频转换为mp4。就范围请求的数量而言,使用faststart标志转换视频会产生很大的不同。一旦我设置了faststart标志,就会出现来自浏览器的范围更小的请求来加载视频。由于现在请求越来越少,express /aws似乎能够处理它。不再有超时时间了。

票数 0
EN

Stack Overflow用户

发布于 2021-06-19 07:50:30

我们正在尝试完全相同的事情,只是我们这样做的原因是,我们想要限制通过我们的后端访问视频,然后再将视频流给用户。因此,直接从s3提供视频并不是一种选择。我意识到视频流很好,但是即使在流成功结束之后,getObject()也会超时120000 ms(aws默认超时时间)。在aws存储库中,似乎存在一个尚未解决的问题。

https://github.com/aws/aws-sdk-js/issues/2087

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49941587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档