如何为 Amazon CloudFront 签署 RTMP url
How to sign an RTMP url for Amazon CloudFront
我正在尝试为 Amazon CloudFront 中的 RTMP 分配创建签名 urls。我有以下工作:
- Web 分发的签名 URL(超过
http
和 https
)- 所以我知道我能够正确地签署 URL。
- 用于 RTMP 分发的未签名 URL - 所以我知道我已经为 RTMP 正确设置了 CloudFront 和 S3。
主要问题 - 现在我正在尝试为 RTMP 获取 signed url,它似乎从来没有可以玩。
部分混淆是基于 url 的格式(类似于 this question)。所以我不知道我签署 url 的哪一部分是否重要——如果我签署整个东西(比如我的 http urls),或者我是否只签署一部分,如果我在路径中包含 mp4:
前缀。
Whosebug 上似乎有很多伪相似的问题,但它们似乎与略有不同的问题有关,而不是关于为 RTMP 实际创建签名 url。
不幸的是,创建 RTMP url 的方式有很多变体,其中
造成了很大一部分混乱。以下是我能够让它与 Amazon CloudFront 一起工作的方式。需要明确的是,这将在 *.SMIL
文件中使用,因此如果您只需要一个 url.
,它可能会有所不同
S3ObjectSummary
对象有一个 key
文件,可能类似于 folder1/folder2/video.mp4
.
- 使用上面的密钥,并删除
.mp4
扩展名。
- 正常签署url(我使用
CloudFrontService.signUrlCanned()
。
- 在生成的
*.smil
文件中,将 base
引用设置为 rtmp://<CloudFront RTMP Distribution Domain>/cfx/st
- 在
video
元素中,设置 height
和 width
,并在 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
对媒体文件进行签名
仅对媒体文件的路径进行签名。
假设您要流式传输位于 '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>
我正在尝试为 Amazon CloudFront 中的 RTMP 分配创建签名 urls。我有以下工作:
- Web 分发的签名 URL(超过
http
和https
)- 所以我知道我能够正确地签署 URL。 - 用于 RTMP 分发的未签名 URL - 所以我知道我已经为 RTMP 正确设置了 CloudFront 和 S3。
主要问题 - 现在我正在尝试为 RTMP 获取 signed url,它似乎从来没有可以玩。
部分混淆是基于 url 的格式(类似于 this question)。所以我不知道我签署 url 的哪一部分是否重要——如果我签署整个东西(比如我的 http urls),或者我是否只签署一部分,如果我在路径中包含 mp4:
前缀。
Whosebug 上似乎有很多伪相似的问题,但它们似乎与略有不同的问题有关,而不是关于为 RTMP 实际创建签名 url。
不幸的是,创建 RTMP url 的方式有很多变体,其中
造成了很大一部分混乱。以下是我能够让它与 Amazon CloudFront 一起工作的方式。需要明确的是,这将在 *.SMIL
文件中使用,因此如果您只需要一个 url.
S3ObjectSummary
对象有一个key
文件,可能类似于folder1/folder2/video.mp4
.- 使用上面的密钥,并删除
.mp4
扩展名。 - 正常签署url(我使用
CloudFrontService.signUrlCanned()
。 - 在生成的
*.smil
文件中,将base
引用设置为rtmp://<CloudFront RTMP Distribution Domain>/cfx/st
- 在
video
元素中,设置height
和width
,并在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
对媒体文件进行签名仅对媒体文件的路径进行签名。
假设您要流式传输位于 '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>