如何为 Amazon CloudFront 签署 RTMP url

How to sign an RTMP url for Amazon CloudFront

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

主要问题 - 现在我正在尝试为 RTMP 获取 signed url,它似乎从来没有可以玩。

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

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

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

,它可能会有所不同
  1. S3ObjectSummary 对象有一个 key 文件,可能类似于 folder1/folder2/video.mp4.
  2. 使用上面的密钥,并删除 .mp4 扩展名。
  3. 正常签署url(我使用CloudFrontService.signUrlCanned()
  4. 在生成的 *.smil 文件中,将 base 引用设置为 rtmp://<CloudFront RTMP Distribution Domain>/cfx/st
  5. video 元素中,设置 heightwidth,并在 src 属性中,将 mp4: 添加到已签名的 [=42] =]部分。

这是一个 SMIL 文件示例。

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

使用 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 存储桶媒体文件 按照上面 link 中的 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>