如何为 Amazon CloudFront 签署 RTMP URL

Posted

技术标签:

【中文标题】如何为 Amazon CloudFront 签署 RTMP URL【英文标题】:How to sign an RTMP url for Amazon CloudFront 【发布时间】:2016-07-20 12:10:51 【问题描述】:

我正在尝试在 Amazon 的 CloudFront 中为 RTMP 分发创建签名 URL。我有以下工作:

用于 Web 分发的签名 URL(通过 httphttps) - 所以我知道我能够正确签名 URL。 用于 RTMP 分发的未签名 URL - 所以我知道我已经为 RTMP 正确设置了 CloudFront 和 S3。

主要问题 - 现在我正在尝试为 RTMP 获取 签名 url,它似乎永远无法播放。

部分混淆是基于 url 的格式(类似于this question)。所以我不知道我签署网址的哪一部分是否重要 - 如果我签署整个事情(如我的 http url),或者我只签署一部分,以及我是否在路径中包含 mp4: 前缀.

*** 上似乎有很多伪相似的问题,但它们似乎与略有不同的问题有关,而不是实际为 RTMP 创建签名的 url。

【问题讨论】:

【参考方案1】:

不幸的是,RTMP 网址的创建方式有很多变体,其中 造成很大一部分混乱。以下是我能够使其与 Amazon CloudFront 一起使用的方式。需要明确的是,这是在 *.SMIL 文件中使用的,因此如果您只需要一个 url,它可能会有所不同。

    S3ObjectSummary 对象的文件有一个key,可能类似于folder1/folder2/video.mp4。 使用上述密钥,删除.mp4 扩展名。 正常签名网址(我使用CloudFrontService.signUrlCanned()。 在生成的*.smil文件中,将base引用设置为rtmp://<CloudFront RTMP Distribution Domain>/cfx/stvideo 元素中,设置heightwidth,并在src 属性中,将mp4: 添加到签名的url 部分。

这是一个示例 SMIL 文件。

<smil data-livestyle-extension="available">
    <head>
        <meta base="rtmp://some-cloud-front-domain.net/cfx/st"/>
    </head>
    <body>
        <switch>
            <video   src="mp4:<signed portion of video path>" />
            <video   src="mp4:<signed portion of video path>" />
        </switch>
    </body>
</smil>

【讨论】:

【参考方案2】:

使用 Python/boto3,我已成功使用 rsa_signer 签署媒体文件

http://boto3.readthedocs.io/en/latest/reference/services/cloudfront.html#generate-a-signed-url-for-amazon-cloudfront

仅对媒体文件的路径进行签名。

假设您要流式传输位于“videos/test.mp4”的 S3 存储桶媒体文件 按照上面链接中的 boto3 示例,您可以执行以下操作来使用 flowplayer 提供文件:

signed_url = cloudfront_signer.generate_presigned_url(
    'videos/test.mp4', date_less_than=expire_date)

然后在flowplayer代码中(Django模板语法):

<div class="flowplayer fp-slim" data-rtmp="rtmp://cloudfront_domain_prefix.cloudfront.net:1935/cfx/st">
   <video>
     <source type="video/flash" src="mp4:signed_src">
   </video>
</div>

【讨论】:

以上是关于如何为 Amazon CloudFront 签署 RTMP URL的主要内容,如果未能解决你的问题,请参考以下文章

AWS:如何为自定义域名配置 Cloudfront

如何为外部字体请求设置 AWS Cloudfront 缓存?

Amazon S3 Cloudfront 部署最佳实践

您如何为 Google Cloud 平台签署 HIPAA BAA?

如何为顶点(example.com)和子域(www.example.com)配置相同的来源 - aws Route53 和 CloudFront

我应该如何为推送通知签署 Mac 应用程序?