我正在开发一个 iOS 应用程序,它允许下载和HTTP 直播 私有(private)视频。视频存储在 Amazon S3 存储桶中(作为 mp4
并分段为 m3u8
/ts
文件)。此外,CloudFront 已打开并连接到存储桶。
由于内容是私有(private)的,我需要在通过 CloudFront 连接时对 URL 进行签名。为了对 URL 进行签名,必须使用私钥,因此如果不将私钥存储在 bundle 中,就不可能在 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
文件中的路径是相对。
关于如何在无需通过签名服务器发送所有内容的情况下实现此功能的任何建议?
最佳答案
使用 S3/CloudFront 或任何其他存储/CDN 执行私有(private) HLS 的正确方法是使用 HLS 加密。查看Apple documentation about this topic .
除了存储播放列表和分段视频文件的存储之外,您还必须集成一个安全的 HTTPS 服务器来存储顶级播放列表和 key 。这些 key 是在使用 Apple HLS 工具进行分段期间生成的。
这是它的工作原理:
MPMoviePlayerController
获取指向安全 HTTPS 服务器上顶级播放列表 (.m3u8
) 的 URL。- 在此文件中有指向变体播放列表 (
prog_index.m3u8
) 的链接,这些播放列表存储在 S3/CloudFront 中并指向视频文件 (.ts
) . - 此外,变体播放列表包含指向读取视频文件所必需的 key 的链接。这些 key 也存储在安全的 HTTPS 服务器上。
见下图:
摘自演示 Mobile Movies with HTTP LIve Streaming (CocoaConf DC, Jun '12)
当然有可能使基础设施更安全,请参阅链接的 Apple 文档。
我还创建了一个用于分段的 Ruby 脚本,以生成具有给定基本 URL 的输出,这使事情变得简单多了。
关于ios - 通过 CloudFront 进行私有(private) HTTP 直播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19290466/