ios - 通过 CloudFront 进行私有(private) HTTP 直播

标签 ios video mpmovieplayercontroller amazon-cloudfront http-streaming

我正在开发一个 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 工具进行分段期间生成的。

这是它的工作原理:

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

见下图:

Protecting HLS Keys

摘自演示 Mobile Movies with HTTP LIve Streaming (CocoaConf DC, Jun '12)

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

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

关于ios - 通过 CloudFront 进行私有(private) HTTP 直播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19290466/

相关文章:

ios - 如果我想在 cellForRowAtIndexPath 中创建三种相似类型的单元格之一,我该如何设置 "common"属性?

ios - MaterializeCss 不适用于 ios

ios - 按下回车键时如何隐藏键盘-Swift

c# - 在 WinForms 应用程序中嵌入视频

ios - 为什么 MPMoviePlayerController 在寻找 HTTP Live 流后报告错误的时间戳

ios - 将动态数组传递给 ImageSlideshow ios

iphone - 如何遍历相机胶卷中存储的所有视频?

c# - FFmpeg "movflags"> "faststart"导致写入无效的 MP4 文件

ios - MPMovieplayercontroller 在流式传输时自动暂停并且不再播放

ios - 当MPMediaItem assetURL为零时如何解决?