我为客户维护一个视频应用程序,我们刚刚通过他们提供的流媒体分发将桌面站点移植到Amazon S3 + CloudFront。要明确的是,我不谈论实时流式传输(我的大多数Google选择)并且我不谈论Flash流媒体。
我们有一个目前使用Influxis的移动网站。这并不是非常昂贵,但我们想要在亚马逊上进行整合,因为它们应该比过去几个月里的Influxis更稳定。
我会承认,虽然我对Flash流媒体有很多了解,但我对HTML视频的速度还不是很快。它只是直接下载还是可以做可变比特率?理想情况下,我们希望能够缩小3G连接不良的人群。
即使它“可能”,亚马逊是否通过其下载分发支持带宽扩展?据我了解,它的流分发仅适用于Flash / RTMP。
如果有人对移动流媒体有任何建议,我也会欢迎他们。
答案 0 :(得分:1)
分组视频(即“HLS”) - iOS设备通过HTTP传送。没有简单的方法可以有效地使用cloudfront。
Wowza Media Server支持使用SMIL播放列表的动态HLS流。我们在工作流程中使用WMS - 如果您想进行一些测试,请随时与我联系!
我们还有一些额外的功能 - 例如,当用户带宽不足以支持视频版本的流时,将图像添加到仅音频流中。
你的问题确实是关于iOS设备 - 虽然你提到了移动设备 - 但RTSP连接需要交付给黑莓(尽管一些最新的套件支持闪存 - 就像剧本一样)。
同样适用于Android< = 2.1 - 没有闪存支持 - 因此内容交付通常通过RTSP完成。
不幸的是 - RTSP不支持这种顺利交付 - 这是一种速度 - 就是这样:)
答案 1 :(得分:0)
非常老的问题,但是我在类似的帖子上发布了我对类似问题的解决方案,因此我也在这里分享了Stream AWS S3 HLS Videos in iOS Browsers
---------------更新如下--------------- (并获得舒适的座位)
使用安全Cookie(适用于基于iOS的浏览器和所有Safari)以及用于Chrome和其他所有功能的安全网址,通过Cloudfront从S3传输受保护的视频。
网站架构:
假设:等同于上述云架构的设置,特别是CF到S3存储桶的IAM配置,以及IAM和CORS的相关S3安全配置。
TL / DR :
NON-SAFARI aka Chrome等-使用安全网址(非常容易OOTB);上面的指南适用于Chrome,但不适用于Safari。
Safari需要安全的Cookie才能以本地方式流式传输hls,并且根本无法识别xhr.beforeRequest重载。 基于SAFARI的SAFARI / iOS浏览器-使用安全Cookie 下面的所有内容对此进行了解释。
设置cookie,听起来很简单!可能是为什么为什么它在AWS CloudFront,AWS论坛或AWSDeveloper Slack频道中没有端到端示例的原因,所以它被认为很容易,因为嘿,它的cookie对吗?
对。 END TL / DR
解决方案详细信息
“ AH-HA!”时刻终于明白,要使其正常工作,您需要能够从自己的服务器上为Cloudfront服务器设置Cookie,这基本上是一项巨大的Web安全禁忌。又名-“在整个网络通话过程中,域名都必须相同”
以及此处的链接https://www.spacevatican.org/2015/5/1/using-cloudfront-signed-cookies/
结合原始的AWS文档,其中包含关于签名Cookie的信息,其中具有域名的cname应用于子域,所有这些最终都对我有用。
解决方案是:
上面的操作是确保END TO END,以便您能够通过从dev。
但是,等等,还有更多要做的事情首先是客户端。 一开始让我什至没有看到Cookie的原因是,它们没有被放置 除非请求者/发起者在启动它的网络调用中使用“ withCredentials:true”标志。在我的代码中,这是对视频列表的后端NodeJS端点的基于ReactJS componentDidMount()的Axios网络REST GET调用(nodeJS从AWS的graphQL获取,但这对于我的修复方法来说并不需要)。>
componentDidMount() {
axios.get('http://dev.<your-domain>.com:3000/api/my-data-endpoint'
,{
withCredentials: true,
})
.then(vidData => {
this.setState({
....//set stuff for player component include to use
});
})
}
当我的axios呼叫中没有“ withCredentials:true”时,就永远不会将cookie发送回去;我一拥有那?我的cookie至少被发送回了第一个调用者localhost(cookie中没有域参数,默认情况下是调用,当时我作为本地主机),这意味着它将永远不会将其传递给CF,是那时的2435h23l4jjfsj.cloudfront.net名称。
因此,更新axios以使用dev。
在上述对我的api的调用中,我得到了类似的信息
{src:’https://cloudfront.<your-domain>.com/path-to-secure-register-m3u8-file’, qps:’?policy=x&signature=y&key-pair-id=z’, blah blah}
[侧边栏-签名的URL都是由Lambda在云中生成的] 对于Chrome,播放器代码会将两者附加在一起,然后在实例化video.js播放器的任何地方,按如下所示重载videojs.Hls.xhr.beforeRequest
videojs.Hls.xhr.beforeRequest = function (options) {
options.uri = `${options.uri}${videojs.getAllPlayers()[0].options().token}`;
return options;
};
在寄存器m3u8文件启动后,将查询字符串?policy = x&signature = y&Key-Pair-ID = z放在流中每个子文件的末尾。
上述api的后端调用在将json作为响应发送之前,也将QP拆开以设置cookie,如下所示
res.cookie("CloudFront-Key-Pair-Id", keypair, {httpOnly: true, path: "/", domain: ‘<your-domain>.com'});
res.cookie("CloudFront-Signature", sig, {httpOnly: true, path: "/", domain: ‘<your-domain>.com'});
res.cookie("CloudFront-Policy", poli, {httpOnly: true, path: "/", domain: ‘<your-domain>.com'});
中断-现在我们将withCredentials设置为true,您可能会看到CORS问题;好玩 在服务器端代码(我的reactJS)中,我在我的nodejs路由器中设置了一些标头
res.header("Access-Control-Allow-Credentials", "true");
res.header("Access-Control-Allow-Origin", "http://dev.<your-domain>.com:8080"); // will be set to just <your-domain>.com for production
在这一点上,东西仍然没有用。这是因为云代码将CF 234hgjghg.cloudfront.net域放入了策略中,而不是我的CNAME映射中。我在云端更新了它。因此,现在我对视频数据的呼叫,是使用cloudfront。
在这一点上,如果我使用了safari调试工具,我就知道自己已经接近了,因为我对尝试流式传输的响应从no key或cookie xml变为了
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
错误,其中包含对我的S3存储桶的引用。对我来说,这意味着我的CF发行版基本上对基于cookie的策略,密钥ID和签名感到满意,并且已经将我传递给S3,但是S3告诉我迷路。
这时的好处是,从dev。
好的,所以我花了一些时间在s3配置中(不编辑任何内容,只是查看所有内容……对我来说100%没问题),然后返回CF分发行为编辑页面,在其中设置标头前锋。 设置(下面列出,然后是我的截图):
发行版保存并传播后,Safari和Chrome视频播放都可以正常工作!
这是一个比我预想的要大得多的兔子洞和一个学位(或15个),但当然,一旦全部写完,一切似乎都非常合理和明显。我希望这至少可以部分地帮助我在互联网上找到的其他人,使用S3的AWS Cloudfront infront在所有主要浏览器上提供安全的流式私有内容
答案 2 :(得分:0)
使用 AWS MediaConvert 将您的 mp4 转换为 HLS 流 - 播放列表 (.m3u8) 以及加密的 .ts 文件。如果您需要更高的安全性,请将其加密。
然后你需要一个像 VideoJS 这样的播放器,它既可以播放渐进式下载视频和音频,也可以播放流视频和音频。 VideoJS 还可以读取解密文件的 URL,并在下载、解密和播放加密的 .ts 段时实时使用它。
还可以查看 WordPress 的 Amazon S3 Video Player,它可以让您无需任何编码即可完成上述所有操作。