来自aws S3的字节范围请求



家伙,所以我有一个问题,始终可靠地寻找视频与HTML5。我正在使用Nodejs从AWS S3桶中获取视频,所有视频都是mp4格式。我已经尝试了多种方法来让视频的当前时间每次移动(大多数时候它工作,但偶尔它不移动),但无济于事。下面是我的代码:

router.get("/*", (req, res, next) => {
let params = {
Bucket: "bucketName",
Key: decodeURIComponent(req.path.substring(1))
};
s3.getObject(params, function(err, data) {
if (err) {
res.status(500).send(err);
} else {
res.contentType(data.ContentType);
res.send(data.Body);
}
});
});
}

我一直在做一些阅读,人们说你可以使用字节范围请求并通过字节范围请求请求整个视频。这家伙似乎做了一个本地文件,但我在如何做一个s3文件的损失。见post: can't寻求html5视频或音频在chrome。我听说人们做的另一个建议是HLS编码,但我不确定什么是最好的方式或如何实现它们,有人能指出我在正确的方向?

我认为最好的答案可能是实现HLS或DASH流解决方案。下面是一个使用S3和CloudFront的HLS示例。这里有一个更全面的流媒体交付最佳实践。

现在,您的应用服务器只是简单地从S3读取整个视频文件,然后在HTTP响应中将整个视频文件内容直接发送给客户端。虽然它似乎可以工作,但最好避免代理此内容,而是直接从S3(或CloudFront)将其提供给客户端。对于私有内容,一种方法是向客户端发送一个S3预签名的URL。

我测试了一个简单的HTML5视频网页和一个s3托管的MPEG视频文件,能够在Chrome上很好地查看它,也可以随意来回查找。我测试了一个相对较小的MPEG文件(15MB)。

<html>
<body>
<h1>Stack Overflow 65796272 Video Sample</h1>
<p>This video and associated poster are sourced from Amazon S3 via pre-signed URL.</p>
<div id="container">
<video id='video' controls="controls" preload='none' width="600" poster="https://poster-presigned-url-here">
<source id='mp4' src="https://video-presigned-url-here" type='video/mp4' />
<p>Your user agent does not support the HTML5 video element.</p>
</video>
</div>
</body>
</html>

我使用awscli预先创建了海报和视频的预签名url,但您可以使用AWS SDK来实现这一点,并将它们动态地提供给您的客户端(或者使用任何标准模板引擎(如Express.js)将它们注入发送给客户端的HTML中)。如果不需要,你可以把海报拿掉。请注意,预签名的url是有时间限制的。

最新更新