【问题标题】:Byte range requests from aws S3来自 aws S3 的字节范围请求
【发布时间】:2021-01-19 17:12:49
【问题描述】:

伙计们,所以我有一个问题是始终如一地可靠地使用 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 文件来做。见帖子:can't seek html5 video or audio in chrome。我听说有人在做的另一个建议是 HLS 编码,但我不确定什么是最好的方法或如何实现它们,有人能指出我正确的方向吗?

【问题讨论】:

  • 也许考虑简单地向浏览器客户端发送一个 S3 预签名 URL,让浏览器和 S3 解决这个问题。而不是您从 S3 代理整个下载。
  • @jarmod 这会解决搜索问题吗?
  • 你必须尝试一下。我不知道你的客户会怎么做。您还可以研究视频流的 HLS 或 DASH 选项,通常通过 CloudFront (example)。
  • 让我直说。您对我的帖子投了反对票,因为您似乎认为签名 URL 可以解决问题。 (顺便说一下,签名的 URL 是出于安全目的而不是解析字节范围请求。请证明我错了)你甚至不知道它是否会起作用?
  • 您没有在此处为远程 GET 提供 任何 支持。如果您想支持它们,因为这是兼容 HTML5 的浏览器将发送的内容,那么您必须在后端支持它们。 S3 确实支持远程 GET,但您的代码不会尝试这样做。我提出签名 URL 方法的原因是因为它类似于您目前正在做的事情(只是将整个文件转储到客户端)并且您声称它大部分时间都有效 - 因此我的建议至少应该有效好吧,而且可能更好,因为它做同样的事情,但以更好的方式。

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


【解决方案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 等引擎)。如果不需要,您可以移除海报。请注意,预签名 URL 是有时间限制的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 2018-07-19
    • 2011-05-18
    • 1970-01-01
    • 2017-12-19
    • 2017-12-13
    • 1970-01-01
    相关资源
    最近更新 更多