使用 AWS Elastic Transcoder 和 S3 流式传输 HLSv4 而无需制作所有内容 public?

Use AWS Elastic Transcoder and S3 to stream HLSv4 without making everything public?

我正在尝试使用 HLSv4 流式传输视频。我正在使用 AWS Elastic Transcoder 和 S3 将原始文件(例如 *.avi 或 *.mp4)转换为 HLSv4。

转码成功,有几个 *.ts 和 *.aac(每个媒体文件都附带 *.m3u8 播放列表文件)和一个链接到媒体文件特定播放列表文件的主 *.m3u8 播放列表文件。我觉得这里一切都井然有序。

麻烦来了:这是一个会员网站,我想避免制作每个视频文件 public。通常使用 S3 执行此操作的方法是在服务器端生成临时密钥,您可以将其附加到 URL。问题是,这将 URLs 更改为媒体文件及其播放列表,因此现有的 *.m3u8 播放列表(提供对其他播放列表和媒体的引用)不包含这些键。

我想到的一个选择是即时生成这些播放列表,因为它们只是文本文件。明显的麻烦是开销,看起来很老套,这些帖子令人沮丧: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 的最佳方式是什么 public?非常感谢任何帮助!

编辑:在下面重新发布我的评论并设置格式...

谢谢你的回复,很有帮助

我脑海中形成的计划是将转换后的 ts 和 aac 文件保留在 S3 上,但生成 6-8 个 m3u8 文件 + 主播放列表并直接从应用服务器提供它们所以用户点击 "Play" 页面jwplayer 从应用服务器获取主播放列表(例如“/play/12/”)。服务器端,这会将 m3u8 文件从 s3 加载到内存中,并搜索并替换媒体特定的 m3u8 链接以使用新生成的 URL 令牌

指向 S3

So user-->jwplayer-->local master m3u8 (verify auth server side)-->local media m3u8s (verify auth server side)-->s3 media files (accessed with signed URL s 和临时令牌)

您认为这种方法有什么问题吗?例如 "you can't reference external media from a playlist" 或类似的 catch 22-ish?

动态生成的播放列表是一种方法。我实际上将类似的东西实现为 Nginx 模块,它运行得非常快,尽管它是用 C 编写并编译的,而不是 PHP.

你第一个 link 中的人更有可能因为 his/hers 1s 区块持续时间而出现问题。这样增加了很多请求和开销,Apple推荐的值为10s.

solutions like HLS encrypted with AES-128 (supported on the Elastic Transcoder),如果你在 the-fly 上这样做也会增加开销,而 HLSDRM 就像 PHLS/Primetime 这很可能会让你在 client-side.

上遇到很多麻烦

似乎有一种方法可以用 Amazon CloudFront 做到这一点。 请注意,我没有亲自尝试过,您需要检查它是否适用于 Android/iOS

想法是使用 Signed Cookies 而不是 Signed URLs。它们显然是在 2015 年 3 月推出的。linked 博客条目甚至使用 HLS 作为示例。

您在对用户进行身份验证后发送 Set-Cookie header 而不是动态 URL。 cookie(希望如此)随每个请求(播放列表和片段)一起传递,并且 CloudFront 决定是否允许访问您的 S3 存储桶:

您可以在此处找到文档: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html