【问题标题】:continuous video stream hosted on another server托管在另一台服务器上的连续视频流
【发布时间】:2018-12-07 21:14:02
【问题描述】:

我遇到了一个特殊的问题。

Server 1A 是一个与用户交互的服务器。服务器 2B2C2D 存储视频内容。

在网站上放置一个html视频标签

<video src="server1adomain.com/videos?video=Gy12C899">

每当获取此内容时,服务器 1A 上的后端脚本会确定视频存储在哪个服务器(2B、2C 或 2D)上并获取它。假设它在2B上。我不想等待整个视频从 2B 获取并存储在 1A 服务器中,然后才发送给用户。相反,我希望连续的流从 2B 流向 1A 并同时流向用户。这样,用户可以以最小的延迟获得视频的第一帧。

这个问题的标准解决方案是什么? cURL 似乎是同步的,首先 100% 获取文件,而不是转发。

看看这张图,看看我的意思:

【问题讨论】:

  • 一旦1A确定了视频的位置,为什么不渲染html所以视频src=server2bdomain.com/...?不要尝试通过多个跃点进行流式传输。
  • 当然,但是用户对内部的了解越少越好。我可能在这里反应过度了。此外,从最终用户的角度来看,所有 youtube 视频都托管在同一个域上,因此这必须是可能的。这是视频 src 在 youtube 上的样子 src="blob:https://www.youtube.com/a6240956-1cb5-4429-b569-309bad7a13da"
  • 假设 Youtube 从 youtube.com 拉取所有视频,你就错了。他们采用了许多其他流媒体平台使用的技术。播放视频时,请检查开发人员工具中的网络选项卡。内容是按时间间隔以块的形式获取的,并且从中获取块的域不是 youtube.com,而是例如https://r3---sn-aigl6n7d.googlevideo.com/videoplayback?c=WEB&amp;requiressl=ye...。这显然使用了 CDN,除非您想实现自己的 CDN,否则您也应该这样做。
  • 哦,你是对的。对于那个很抱歉。我仍然想隐藏存储的位置。有什么方法可以通过 1 跳进行流式传输吗?我发现了这个问答stackoverflow.com/questions/38417350/…。它确实下载了视频。但不幸的是,我不能将此 file.php 用作 html 视频标签中的 src 属性。
  • 您担心的是用户不应该能够通过检查视频 src 来获取内容。分块提取内容的技术相当复杂,但对您来说重要的一点是请求已签名,因此无法重播。具有相同签名的相同请求将无法重复尝试。这可能包括签名生成中的当前时间戳。

标签: php


【解决方案1】:

这主要是评论,但 cmets 部分的空间有限。

但用户对内部的了解越少越好。

为什么?如果您不能清楚地表达您的要求(当它们看起来很不寻常时),那么很难推荐一个解决方案。

所有 youtube 视频都...托管在同一个域上,所以这一定是可能的

当然有可能,但我非常相信 youtube 无法使用您描述的架构实现这一目标。即使他们使用相同的虚拟主机提供来自 URL 的所有内容,也不会像您描述的那样实现。支持此类服务的(显而易见的)解决方案是反向代理前端非对称主机充当 HTTP 路由器。

在首先 100% 获取文件方面,cURL 似乎是同步的

仅当您使用默认设置时。撇开使用 Curl 执行多个 RANGE 请求的可能性不谈,如果您指定 CURLOPT_READFUNCTION 选项,您可以从后端一次读取一个块并将其发送到客户端。

【讨论】:

    猜你喜欢
    • 2016-03-13
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多