来自 aws S3 的字节范围请求

时间:2021-01-19 17:12:49

标签: amazon-web-services amazon-s3 html5-video seek

伙计们,所以我在使用 HTML5 始终可靠地寻找视频时遇到了问题。我正在使用 Nodejs 从 AWS S3 Bucket 获取视频,所有视频都是 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 文件来做。见帖子:https://github.com/cosmos/cosmos-sdk/blob/master/x/distribution/client/cli/tx.go#L165-L180。我听说有人在做的另一个建议是 HLS 编码,但我不确定什么是最好的方法或如何实现它们,有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

我认为最好的答案可能是实施 HLS 或 DASH 流媒体解决方案。这是 HLS with S3 and CloudFront 的示例。这是一个更全面的Best Practices for Streaming Media Delivery

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

我针对 S3 托管的 MPEG 视频文件测试了一个简单的 HTML5 视频网页,并且能够在 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 开发工具包执行此操作并将它们动态提供给您的客户端(或将它们注入到使用任何标准模板发送给客户端的 HTML 中) Express.js 等引擎)。如果不需要,您可以删除海报。请注意,预签名网址是有时间限制的。