使用 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 上这样做也会增加开销,而 HLS
和 DRM
就像 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
我正在尝试使用 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 令牌
指向 S3So 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 上这样做也会增加开销,而 HLS
和 DRM
就像 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