通过CloudFront进行私有HTTP直播

Luk*_*nek 6 video mpmovieplayercontroller http-streaming ios amazon-cloudfront

我工作的iOS应用程序,它允许下载和HTTP实时流私人视频.视频存储在Amazon S3存储桶中(mp4作为m3u8/ ts文件分段).此外,CloudFront已打开并连接到存储桶.

由于内容是私有的,因此我需要在通过CloudFront连接时对URL进行签名.为了对URL进行签名,必须使用私钥,因此,如果不将私钥存储在捆绑包中,则无法在iOS应用程序中生成签名URL.这将是个坏主意!

所以我决定编写一个简单的Ruby服务器,它执行URL签名并重定向到生成的签名CloudFront URL,如下所示:


HTTP://signing.server.local/videos/1.mp4 →交通 https://acbdefg123456.cloudfront.net/videos/1.mp4??Expires=XXX&Signature=XXX&Key-Pair-Id=XXX

HTTP://signing.server.local/videos/1.m3u8 →交通 https://acbdefg123456.cloudfront.net/videos/1.m3u8??Expires=XXX&Signature=XXX&Key-Pair-Id=XXX


对于视频下载,它运行良好,因为只有一个请求.但是,当我希望流式传输内容并提供MPMoviePlayerController签名服务器的URL时,服务器只会签署第一个请求并重定向到CloudFront.对于下一个请求,MPMoviePlayerController将第一个签名的CloudFront URL作为基础并尝试直接连接而不会抛出签名服务器.

m3u8文件中的路径是相对的.

有关如何实现此功能而无需通过签名服务器发送所有内容的任何建议?

Luk*_*nek 8

使用S3/CloudFront或任何其他存储/ CDN执行专用HLS 的正确方法是使用HLS加密.请参阅有关此主题Apple文档.

除了存储播放列表和分段视频文件的存储空间外,您还必须集成安全的HTTPS服务器,以存储顶级播放列表和密钥.这些密钥是在使用Apple HLS工具进行分段期间生成的.

下面是它的工作原理:

  1. MPMoviePlayerController获取指向顶级播放列表(一个URL .m3u8)在安全的HTTPS服务器.
  2. 在此文件中有指向变体播放列表(prog_index.m3u8)的链接,这些链接存储在S3/CloudFront中,并指向视频文件(.ts).
  3. 另外,变体播放列表包含到键的链接,这是读取视频文件所必需的.这些密钥也存储在安全的HTTPS服务器上.

见下图:

保护HLS密钥

摘自移动电影与HTTP LIve Streaming(CocoaConf DC,Jun '12)

当然,有可能使基础设施更安全,请参阅链接的Apple文档.

我还创建了一个用于分段的Ruby脚本,以生成具有给定基本URL的输出,这使事情变得更加简单.

  • 这个答案出现在我关于使用cloudfront保护HLS视频的搜索的顶部.我认为它有点过时,所以我想我会修改答案,指出安全cookie是限制在云端访问HLS的主要AWS示例用例之一:http://docs.aws .amazon.com/AmazonCloudFront /最新/ DeveloperGuide /私人化内容选择签名的URL,cookies.html (3认同)