gpt4 book ai didi

spring - 使用 Spring Framework 和 Chrome 设置视频流

转载 作者:行者123 更新时间:2023-12-03 17:20:04 24 4
gpt4 key购买 nike

我们正在编写一个 Spring 服务,它提供一个 HTTP 端点,通过该端点可以流式传输来自 Amazon S3 存储的视频(或音频)文件。基本思想是,您可以在 Google Chrome 地址栏中输入一个 url,该服务将从 S3 获取文件并流式传输,这样用户就可以立即开始观看,而无需等待下载到完成,并且用户可以单击视频进度条中的随机位置并立即从该位置开始观看视频。
我理解这在理论上应该可行的方式是 Chrome 开始下载文件。该服务以 HTTP 200 响应并包含 Accept-Ranges: bytesContent-Length: filesize标题。 filesize是已知的,因为我们可以从 S3 中将其作为元数据进行查询,而无需获取整个文件。包含这些 header 会导致浏览器取消下载,并使用 Range: bytes=0-whatever 再次请求文件。 header (其中 whatever 是 Chrome 决定的某个 block 大小)。然后该服务使用 HTTP 206(部分内容)和请求的字节范围进行响应,我们可以很容易地确定这些范围,因为 S3 支持相同的范围协议(protocol)。 Chrome 然后从服务请求连续的 block ,直到流结束。
在 Spring 方面,我们将数据发送到 ResponseEntity<InputStreamResource> (根据 this SO answer )。
然而,我们在实践中观察到,虽然 Chrome 会在几百字节后取消它的第一个请求。但是,它会发送带有 Range: bytes=0- 的第二个请求。 header ,有效地要求整个文件。服务器响应 HTTP 206。结果,它只下载了几百字节的视频,而且视频显然没有开始播放。
有趣的是,在 Firefox 中一切正常。不幸的是,我们的应用需要支持 Chrome。我们是否遗漏了协议(protocol)的某些部分?

最佳答案

事实证明,我们在 Content-Range 中有一个错误。响应头。
语法是 Content-Range: bytes start-end/total .与 total10 ,如果要获取整个范围,需要指定bytes 0-9/10 ,而不是 0-10/10 ,这就是我们正在做的事情。
当然,随着实际文件的大小更大,以及这些文件中间的实际 block 范围,这个错误比上一段中的人为示例更难注意到...... ಠ_ಠ

关于spring - 使用 Spring Framework 和 Chrome 设置视频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63485686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com