使用 AWS Elastic Transcoder 和 S3 在不公开所有内容的情况下流式传输 HLSv4?
Posted
技术标签:
【中文标题】使用 AWS Elastic Transcoder 和 S3 在不公开所有内容的情况下流式传输 HLSv4?【英文标题】:Use AWS Elastic Transcoder and S3 to stream HLSv4 without making everything public? 【发布时间】:2015-09-14 03:41:32 【问题描述】:我正在尝试使用 HLSv4 流式传输视频。我正在使用 AWS Elastic Transcoder 和 S3 将原始文件(例如 *.avi 或 *.mp4)转换为 HLSv4。
转码成功,有几个 *.ts 和 *.aac(每个媒体文件都附带 *.m3u8 播放列表文件)和一个链接到媒体文件特定播放列表文件的主 *.m3u8 播放列表文件。我觉得这里一切都井然有序。
现在麻烦了:这是一个会员网站,我想避免公开每个视频文件。通常使用 S3 执行此操作的方法是在服务器端生成临时密钥,您可以将其附加到 URL。麻烦的是,这会更改媒体文件及其播放列表的 URL,因此现有的 *.m3u8 播放列表(提供对其他播放列表和媒体的引用)不包含这些键。
我想到的一个选择是即时生成这些播放列表,因为它们只是文本文件。明显的麻烦是开销,看起来很hacky,这些帖子令人沮丧:https://forums.aws.amazon.com/message.jspa?messageID=529189,https://forums.aws.amazon.com/message.jspa?messageID=508365
在花了一些时间在这之后,我觉得我在绕圈子,而且似乎没有一个非常清楚的解释来说明如何做到这一点。
那么截至 2015 年 9 月,在不公开您的内容的情况下,使用 AWS Elastic Transcoder 和 S3 流式传输 HLSv4 的最佳方式是什么?非常感谢任何帮助!
编辑:在下面重新发布我的评论并带有格式...
谢谢你的回复,很有帮助
我脑海中形成的计划是将转换后的 ts 和 aac 文件保留在 S3 上,但生成 6-8 个 m3u8 文件 + 主播放列表并直接从应用服务器提供它们所以用户点击“播放”页面并且 jwplayer 获得主来自应用服务器的播放列表(例如“/play/12/”)。服务器端,这会将 m3u8 文件从 s3 加载到内存中,然后搜索并替换媒体特定的 m3u8 链接,以用新生成的 URL 令牌指向 S3
所以用户-->jwplayer-->本地主m3u8(验证身份验证服务器端)-->本地媒体m3u8s(验证身份验证服务器端)-->s3媒体文件(使用签名的URL和临时令牌访问)
您认为这种方法有什么问题吗?例如“你不能从播放列表中引用外部媒体”或类似的东西可以捕捉到 22-ish?
【问题讨论】:
【参考方案1】:动态生成的播放列表是一种方法。我实际上将类似的东西实现为 nginx 模块,它运行得非常快,尽管它是用 C
编写并编译而不是 php
。
由于他/她的1s
块持续时间,您第一个链接中的人更有可能遇到问题。这增加了很多请求和开销,Apple
推荐的值为10s
。
有solutions 像HLS
用AES-128
(supported on the Elastic Transcoder) 加密,如果你在运行时这样做也会增加开销,还有HLS
和DRM
像PHLS
/@ 987654338@ 这很可能会让您在客户端遇到很多麻烦。
似乎有一种方法可以使用Amazon CloudFront
。 请注意,我没有亲自尝试过,您需要检查它是否适用于android
/ios
。
这个想法是使用Signed Cookies 而不是Signed URLs
。它们显然是在 2015 年 3 月推出的。链接的博客条目甚至使用 HLS
作为示例。
在对用户进行身份验证后,您将发送 Set-Cookie
标头,而不是动态 URL。 cookie(希望)随每个请求(播放列表和片段)一起传递,CloudFront
决定是否允许访问您的 S3 存储桶:
您可以在此处找到文档: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html
【讨论】:
感谢您的回复,非常有帮助 我脑海中正在形成的计划是将转换后的 ts 和 aac 文件保留在 S3 上,但生成 6-8 个 m3u8 文件 + 主播放列表并直接提供它们从应用服务器所以用户点击“播放”页面,jwplayer 从应用服务器获取主播放列表(例如“/play/12/”)。服务器端,这会将 m3u8 文件从 s3 加载到内存中,并搜索并替换媒体特定的 m3u8 链接以使用新生成的 URL 令牌指向 S3 所以 user-->jwplayer-->local master m3u8-->local media m3u8s- ->s3 媒体文件你觉得这种方法有什么问题吗? 它应该可以工作,因为如果我猜对了,您将提供 HLS VOD 播放列表。客户端将只下载一次主文件和每个变体m3u8
播放列表,因此您只需要在播放开始或之前创建它们(与 Live 相比,您必须定期执行它,因为它使用滑动窗口)。不过,处理成本会更高,因为您拥有列表中的所有细分市场。您的负载会激增,而不是持续使用。
这是一个类似的示例,但使用了加密和 Azure:azure.microsoft.com/en-us/blog/…以上是关于使用 AWS Elastic Transcoder 和 S3 在不公开所有内容的情况下流式传输 HLSv4?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Elastic beanstalk 和 Dockerrun.aws.json 正确部署到 AWS?
使用 AWS 和 Elastic Beanstalk 的 Websocket
使用 AWS CodeBuild 和 EB CLI 部署到 AWS Elastic Beanstalk
AWS CodePipeline - 使用现有 Dockerrun.aws.json 部署到 Elastic Beanstalk
使用 AWS Elastic Beanstalk 在 AWS 上部署 Spring Boot 应用程序
创建 AWS Elastic Beanstalk Ruby/Rails 应用程序环境 [AWS 免费套餐] 时使用了哪些 AWS 资源/服务?