使用亚马逊 CloudFront 进行 RTMP 的 CDN 加速

来源:互联网 发布:淘宝云客服怎么联系 编辑:程序博客网 时间:2024/06/10 01:59
        本文介绍如何使用亚马逊 CloudFront 配置和管理你的 RTMP 服务 CDN 加速网络。更多关于如何创建一个 RTMP 分发,参见 创建 RTMP 分发。


        RTMP 分发是如何工作的
        要使用 CloudFront 流化多媒体文件,你需要给你的终端用户提供两种类型的文件:
  • 你的多媒体文件
  • 一个媒体播放器,例如,JW Player、Flowplayer 或者 Adobe Flash。
        终端用户使用你提供给他们的媒体播放器观看你的媒体文件;他们并不使用已经安装在他们电脑或其他设备上的媒体播放器 (如果已经安装了的话)。
        当一个终端用户加载你的媒体文件流时,媒体播放器在文件还在从 CloudFront 下载的时候就开始播放其内容。媒体文件并不在终端用户的系统里本地存储。
        要让 CloudFront 对媒体播放器和媒体文件都侍服,你需要两种类型的分发:一个 web 分发用于媒体播放器,一个 RTMP 分发用于媒体文件。web 分发通过 HTTP 侍服文件,而 RTMP 分发媒体文件流通过 RTMP (或者一个 RTMP 变种)。
        接下来的示例假定你的媒体文件和你的媒体播放器存储在亚马逊 S3 上不同的 bucket 下,但这也不是必须的 —— 你也可以把媒体文件和你的媒体播放器存储在同一个亚马逊 S3 bucket 下。当然,你也可以通过其他方式把媒体播放器提供给终端,例如,使用 CloudFront 和一个自定义源。但是,媒体文件必须使用亚马逊 S3 bucket 作为源。
        在下图中,你的站点通过域 d1234.cloudfront.net 为每个终端用户侍服一个媒体播放器缓存的副本。媒体播放器随后通过 s5678.cloudfront.net 域访问你的媒体文件的缓存副本。

Streaming_Setup


1你的媒体播放器 bucket 持有媒体播放器并作为一个常规 HTTP 分发的源服务器。在这个例子中,分发的域名是 d1234.cloudfront.net。(d1234.cloudfront.net 中的 d 表明这是一个 web 分发。)2你的媒体流 bucket 持有你的媒体文件并作为一个 RTMP 分发的源服务器。在这个例子中,分发的域名是 s5678.cloudfront.net。(s5678.cloudfront.net 中的 s 表明这是一个 RTMP 分发。)


        当你配置 CloudFront 去分发每天文件时,CloudFront 使用 Adobe Flash Media Server 3.5 作为流服务器,并且使用 Adobe 的实时消息传输协议 (RTMP,Adobe Real-Time Messaging Protocol) 流化你的媒体文件。CloudFront 通过端口 1935 和 80 接收 RTMP 请求。
        CloudFront 支持以下的 RTMP 协议的变种:
  • RTMP - Adobe 的实时消息传输协议
  • RTMPT - Adobe 基于 HTTP 隧道流传输
  • RTMPE - Adobe 加密传输
  • RTMPTE - Adobe 基于 HTTP 隧道加密传输
        关于 Adobe Flash Media Server 所支持的关于 RTMP 和文件格式的概要,参考 Adobe 官方网站 Overview of Streaming with Flash Media Server 3,这个概述包括所支持的编解码器和容器。
        因特网上的一些可用资源可以帮你确定你的 Flash 文件要使用的位率,比如,Adobe 官网的 Flash 视频 (FLV) 位率计算器。
        CloudFront 支持 Adobe Flash Media Server 3.5 有关动态视频的所有特性,这让你可以在播放时在不同品质的流直间进行切换。更多信息,可以参考 Adobe 官网 Flash Media Server 3.5 中的动态流:第一部分。
        要进行流内容服务,你需要提供给你的终端客户一个媒体播放器。你可以使用 Adobe Flash 编写你自己的播放器。更多信息,参考 Adobe 官网 http://www.adobe.com/products/flashplayer/。或者,你也可以使用现成的播放器。更多信息,请看以下教程:
  • 使用 CloudFront 和 Adobe Flash Player 进行流媒体点播
  • 使用 CloudFront 和 Flowplayer for Adobe Flash 进行流媒体点播
  • 使用 CloudFront 和 JW Player 进行流媒体点播


        使用一个 Amazon S3 Bucket 作为一个 RTMP 分发的源
        在你创建一个分发的时候,你配置了 CloudFront 从哪里拿到分发给边缘位置的文件。对于一个 RTMP 分发,你必须使用一个亚马逊 S3 bucket;不支持自定义源。要把你的对象放进你的 bucket,你可以使用亚马逊 S3 提供的任何方法,例如,亚马逊 S3 API 或者一个第三方的工具。你可以像其他亚马逊 S3 bucket 中一样在你的 bucket 里创建一个层次结构。这样将导致亚马逊 S3 定期为存储的文件收取费用。更多关于关于使用 CloudFront 的费用信息,参见 CloudFront 的计费和使用。
        使用一个现成的亚马逊 S3 bucket 作为你的 CloudFront 源服务器并不会对这个 bucket 做任何改变;你可以正常地对这个 bucket 存储和访问 S3 对象 (以正常的 S3 价格)。
        你可以同时为 RTMP 和 web 分发的创建使用同一个 S3。
                注意
                一旦你创建了一个 RTMP 分发,你将无法更改其源服务器。如果你想要更改一个 RTMP 分发的 S3 bucket,你必须新建一个使用新 bucket 的分发,并且将你的链接或者 DNS 记录修改为新分发所使用的域名。然后你可以将原来的分发删除,更多信息请参考 删除一个分发。
        你可以这样对你想要的 CloudFront 获取对象的亚马逊 S3 bucket 进行命名:
        bucket-name.s3.amazonaws.com
        不要使用以下值对其进行命名:
  • 亚马逊 S3 路径格式的,如 s3.amazonaws.com/bucket-name
  • 亚马逊 S3 别名,如果有的话
                重要
                作为 CloudFront 原服务器,你的 bucket 命名必须遵循 DNS 命名要求。更多信息,参考亚马逊简单存储服务开发者指南中的 bucket 限制和局限性。


        为一个源服务器创建多个 RTMP 分发
        通常你可以为每一个亚马逊 S3 bucket 只创建一个 RTMP 分发,但是你也可以为同一个 bucket 创建多个 RTMP 分发。例如,如果你的一个亚马逊 S3 bucket 有两个分发,你可以使用任一个分发索引到单一媒体文件。在这种情况下,如果在你的原服务器中有一个叫做 media.flv 的媒体文件,CloudFront 将会分别以一个单独的 media.flv 对象对每个分发进行访问:一个分发中可以访问的 media.flv,通过另一个分发的另一个 media.flv。


        创建或更改一个 RTMP 分发时要配置的值
        要使用 CloudFront 流化媒体文件,创建一个 RTMP 分发并指定以下值。
        Origin Domain Name (源的域名,亚马逊 S3 bucket)
        CloudFront 要获取对象的 S3 bucket 源的 DNS 域名,比如,myawsbucket.s3.amazonaws.com。在 CloudFront 控制台中,点击 Origin Domain Name 字段,当前 AWS 账户相关联的亚马逊 S3 bucket 被列出。要使用来自一个不同 AWS 账号的 bucket,以以下格式将该 bucket 的域名输入:
        bucket-name.s3.amazonaws.com
        文件必须是公开可读的,除非你使用一个 CloudFront 源访问验证来包含你在亚马逊 S3 的内容。更多信息,参考 使用源访问验证来限制对你的亚马逊 S3 内容的访问。
                重要
                bucket 名必须遵循 DNS 命名要求。更多信息请参考 亚马逊简单存储服务开发者指南 中的 bucket 限制和局限性。
        当你改变 CloudFront 获取对象的起源的 bucket 时,CloudFront 会立即将修改复制到 CloudFront 边缘位置。直到分发配置在一个指定边缘位置被更新以后,CloudFront 才会继续将请求转发给之前的亚马逊 S3 bucket。一旦分发配置在该边缘位置被更新,CloudFront 开始将新的请求转发给新的亚马逊 S3 bucket。
        bucket 的修改不需要 CloudFront 从新的源重新载入边缘缓存。只要你的应用中的视图请求没有更改,CloudFront 会继续以已缓存在一个边缘缓存中的对象进行侍服,直到每个对象的保鲜期到了,或者很少被请求的对象被移除。
        Restrict Bucket Access (限制 bucket 访问,只适用于亚马逊 S3)
        如果你想要要求终端用户只能使用 CloudFront URL 而不是亚马逊 S3 URL 来访问亚马逊 S3 bucket 中的对象点击 Yes。然后指定适用的值。
        如果你想要终端用户既能使用 CloudFront URL 也可以使用亚马逊 S3 URL 来访问对象的话点击 No
        更多信息请参考 使用源访问身份来限制对你亚马逊 S3 内容的访问。
        Origin Access Identity (限制对 bucket 的访问,只适用于亚马逊 S3)
        如果你为 Restrict Bucket Access 选择了 Yes,接下来选择是否创建一个新的源访问验证或者使用和你 AWS 账号关联的一个现有的源。如果你已经有了一个源访问验证,我们建议你复用它以简化维护。关于更多源访问验证信息,参考 使用源访问身份来限制对你亚马逊 S3 内容的访问。
        Comment for New Identity (对于新的验证的注释,只适用于亚马逊 S3)
        如果你为 Origin Access Identity 选择了 Create a New Identity,输入一条注释以标识新的源访问验证。CloudFront 会在你创建这个分发时创建源访问验证。
        Your Identities (你的验证,只适用于亚马逊 S3)
        如果你为 Origin Access Identity 选择了 Use an Existing Identity,选择你想要使用的源访问验证。 你不可以使用其他 AWS 账号关联的源访问验证。
        Grant Read Permissions on Bucket (为 bucket 分配读权限,只适用于亚马逊 S3)
        如果你想要 CloudFront 为你的亚马逊 S3 bucket 源访问验证自动分配读取权限,点击 YesUpdate Bucket Policy
                重要
                如果你点击 YesUpdate Bucket Policy,CloudFront 会更新 bucket 策略来分配对指定源的访问权限。但是,CloudFront 并不移除掉 bucket 策略中已有权限和单个对象的权限。如果当前用户有权限使用亚马逊 S3 URL 访问你的 bucket 中的对象,他们将在 CloudFront 修改你的 bucket 策略后仍具有权限。要查看或者修改现有 bucket 策略和你的 bucket 中对象的现有权限,使用亚马逊 S3 提供的方法。更多信息参考 分配你的亚马逊 S3 bucket 中对象访问许可权限。
        如果你想要手工修改权限,例如,如果你想要修改你的对象的访问控制表而不是 bucket 权限,点击 NoI will Update Permissions
        Price Class (价格类目)
        价格类目对应于你想要为 CloudFront 服务支付的最高价格。默认情况下,CloudFront 以所有 CloudFront 所在地区来侍服你的对象。
        更多关于价格以及你的选择的价格类目是如何影响到你分发的 CloudFront 性能的信息,参考 为一个 CloudFront 分发选择价格类目。关于 CloudFront 价格的信息,包括价格类目是如何映射到 CloudFront 地区的,参考 亚马逊 CloudFront 价格。
        Alternate Domain Names (不同的域名,别名)
        可选。你可以将一个或更多的别名关联到一个分发,这样你可以在 URL 中请求对象时使用你自己的域名 (例如,example.com) 而不是使用在你创建你的分发时 CloudFront 分配给你的域名。更多信息参考 使用其他域名 (别名)。
        Logging (日志)
        你是否想要 CloudFront 去记录对于一个对象的每一次请求并日志文件保存在亚马逊 S3 bucket 下。你可以在任何时候启用或者关闭日志。如果你启用日志的话不会产生额外费用,但你会增加亚马逊 S3 对于存储和访问文件 (为你的日志文件) 的费用。你可以在任何时候删除日志。更多关于 CloudFront 访问日志的信息,参考 访问日志。
        Bucket for Logs (用于存储日志的 bucket)
        如果你为 Logging 选择了 On,你想要 CloudFront 存储访问日志所在的亚马逊 S3 bucket,比如,myawslogbucket.s3.amazonaws.com。如果你启用了日志,CloudFront 会记录对于一个对象的每一次请求并存储日志文件保存在指定的亚马逊 S3 bucket 下。你可以在任何时候启用或者关闭日志。更多关于 CloudFront 访问日志的信息,参考 访问日志。
        Log Prefix (日志前缀)
        可选。如果你为 Logging 选择了 On,定义前缀字符串,如果你想要 CloudFront 为这一分发的访问日志文件加上前缀的话,例如,exampleprefix/。尾部的斜杠 (/) 是可选的,但建议你加上以简化浏览你的日志文件操作。更多关于 CloudFront 访问日志的信息,参考 访问日志。
        Comment (注释)
        可选。当你创建一个分发时,你可以包含一个最多 128 个字符的注释。你可以随时对注释进行更改。
        Distribution State (分发状态)
        在你创建分发的时候,你必须在它创建后指定是否需要分发激活或者禁止:
  • 激活意思就是,一旦分发被完全部署,你就可以使用分发的域名部署你的链接了,之后你的终端用户就可以检索内容了。每当分发是激活的时候,CloudFront 接受并处理任何终端用户使用关联到该分发的域名对内容的请求。
        当你创建、修改或者删除一个 CloudFront 分发时,在你的改变传播给 CloudFront 数据库需要一些时间。在这段时间内,如果立即来了一个关于分发信息的请求可能不会看到你做出的改变。这个传播一般会在几分钟内搞定,但一个高系统负载或网络分区可能会增加这个时长。
  • 禁止意味着尽管分发可能已被部署并且可以被使用,但终端用户不能使用它。当分发是禁止时,CloudFront 并不接受使用了关联到该分发的域名的终端用户的请求。在你将分发由禁止切换到激活之前 (通过修改分发配置),没有人可以使用它。
        你可以随心所欲地对分发在禁止和激活之间进行切换。更多关于分发配置的信息,参考 罗列、查看以及修改 CloudFront 分发。
        Restrict Viewer Access (限制浏览访问,使用 URL 签名)
        如果你想要终端用户使用公开 URL 请求这一分发所侍服的对象,点击 No。如果你想要请求使用签名 URL,点击 Yes。然后指定你想要使用签名 URL 的 AWS 账户;这些用户是为已知的被信任的签名者。
        更多关于受信任的签名者的信息,参考 指定可以创建签名 URL 的 AWS 账户 (受信任的签名者)。
        Trusted Signers (受信任的签名者)
        选择你想要为该分发作为受信任的签名者的 AWS 账户:
  • Self:把当前登录到 AWS 管理控制台的账户选择为受信任的签名者。如果你是作为一个 IAM 用户登录,那么相关联的 AWS 账户将被添加为受信任的签名者。
  • Specify Accounts (指定账户):在 AWS Account Numbers 字段输入受信任的签名者的账号。
        要创建一个 URL 签名,AWS 账户必须至少有一个可用的 CloudFront 密钥对。
                警告
                在你修改你已经作为分发内容使用着的分发时,在你准备好为你的对象开始生成 URL 签名以后你再添加受信任的签名者。在你添加给分发受信任的签名者之后,用户就只能使用签名的 URL 来访问这一分发所侍服的对象了。
        AWS Account Numbers (AWS 账号)
        如果你想要为当前账户之外的 AWS 账户创建签名的 URL,在这一字段的每一行输入一个 AWS 账号。注意:
  • 你要指定的账户必须至少有一个可用的 CloudFront 密钥对。更多信息请参考 为你新人的签名者创建 CloudFront 密钥对
  • 你无法为 IAM 用户创建密钥对,因此你不能把 IAM 用户用作受信任的签名者。
  • 更多关于如何获取一个账户的 AWS 账号的信息,参考 亚马逊网络服务参考书 中的 我如何拿到安全凭据?
  • 如果你输入了当前登录用户的账号,CloudFront 会自动勾选 Self 复选框并将这一账号从 AWS Account Numbers 列表中移除。


        在你创建或者修正 RTMP 分发时控制台显示的 CloudFront 的值
        在你创建一个新的 RTMP 分发或者修改一个现有的分发时,CloudFront 会在 CloudFront 控制台显示以下信息。
                注意
                可用的受信任的签名者,拥有一个可用的 CloudFront 密钥对并可以用于创建有效的签名 URL 的 AWS 账户,目前在 CloudFront 控制台是不可见的。
        Distribution ID (分发 ID)
        当你使用 CloudFront API 操作分发时,你可以使用分发 ID 来指定你想要操作的哪一个分发,例如,EDFDVBD6EXAMPLE。你无法修改分发 ID。
        Status (状态)
        分发可能会有的状态值如下所示:

值描述InProgress分发仍在被创建或修改中。Deployed分发已被创建或者修改,并且修改已被完全传播到整个 CloudFront 体系。

        除了确保分发的状态是 Deployed 之外,你必须在终端用户可以使用 CloudFront 访问你的内容之前激活分发。更多信息请参考 分发状态。
        Last Modified (最后修改时间)
        分发最后修改时间的日期和时间,使用 ISO 8601 格式,比如,2012-05-19T19:37:58Z。更多信息参考 http://www.w3.org/TR/NOTE-datetime。
        Domain Name (域名)
        你在对你的对象访问时的链接用的是分发的域名,除非你使用替换域名 (别名)。比如,如果你分发的域名是 d111111abcdef8.cloudfront.net,示例文件 /images/image.jpg 的链接将会是为 http://d111111abcdef8.cloudfront.net/images/image.jpg。你无法为你的分发修改 CloudFront 域名。更多关于链接到你的对象的 CloudFront URL 信息参考 CloudFront 对象 URL 格式。
        如果你指定了一个或多个替换域名 (别名),你就可以使用你自己的域名来链接到你的对象,而不是使用 CloudFront 域名。更多关于别名的信息请参考本文中的 替换域名。
                注意
                CloudFront 域名是唯一的。当前分发的域名永远不会用于以前的分发,而且也永远不会被将来另一个分发所复用。


        配置媒体播放器
        要播放媒体文件,你必须为媒体播放器为该文件指定恰当的路径。如何配置媒体文件取决于你所使用的媒体播放器以及你如何使用它。
        在你配置媒体播放器时,你为媒体文件配置的路径必须在域名之后紧跟 cfx/st,比如:rtmp://s5c39gqb8ow64r.cloudfront.net/cfx/st/mediafile.flv
                注意
                CloudFront 遵循 Adobe 的 FMS 命名要求。不同的播放器如何配置流具有自己的规则。上面的例子是为 JW Player 的。检查你自己播放器的文档。例如,Adobe 的 Flash Media Server 不允许 .flv 后缀出现于播放路径中。有一些播放器为你将 .flv 后缀移除。
        你的媒体播放器可能会要求路径和文件名分开。例如,对于 JW Player,你指定一个有效的流和文件:
  • streamer - rtmp://s5c39gqb8ow64r.cloudfront.net/cfx/st (没有斜杠后缀)
  • file - mediafile.flv
        如果你在 bucket 的一个目录中存放媒体文件 (例如,videos/mediafile.flv),JW Player 的变量可以是:
        streamer - rtmp://s5c39gqb8ow64r.cloudfront.net/cfx/st (没有斜杠后缀)
        file - videos/mediafile.flv
        JW Player 使用参考 JW Player 官网的 安装向导。
        MPEG Files (MPEG 文件)
        要侍服 MP3 音频文件或者 H.264/MPEG-4 视频文件,你可能需要给文件名加上前缀 mp3: 或者 mp4:。一些媒体播放器可以被配置为自动添加前缀。媒体播放器也可能需要你去指定没有后缀的文件名 (例如,magicvideo 代替 magicvideo.mp4)。


        使用 crossdomain.xml 限制访问
        Adobe Flash Media Server 的 crossdomain.xml 文件指定了哪些域可以访问特定域中的媒体文件。CloudFront 提供了一个默认文件以允许所有域都可以访问你的 RTMP 分发的媒体文件,你无法更改这一行为。如果你在你的亚马逊 S3 bucket 中包含了一个更严格的 crossdomain.xml 文件,CloudFront 将其忽略。


        RTMP 分发的错误码
        以下列举了 CloudFront 可能会发送给你的媒体播放器的错误码。这些错误是和 Event.info.application.message 或者 Event.info.description 一起返回的字符串的一部分。

错误描述DistributionNotFound分发没有找到。DistributionTypeMismatch分发不是一个 RTMP 分发。InvalidInstance无效的实例。InvalidURI无效的 URI。


        RTMP 分发纠错
        如果你在获取用以播放的媒体文件出错,检查以下几项。

检查项目描述媒体播放器文件和媒体文件分开分发媒体播放器必须侍服以一个常规的 HTTP 分发 (比如,域名 d111111abcdef8.cloudfront.net),媒体文件必须以 RTMP 分发的方式侍服 (比如,域名 s5c39gqb8ow64r.cloudfront.net)。确保你没有同时为两者使用了同一分发。文件路径中加上 /cfx/st确认你的文件路径中包含了 /cfx/st。你不需要为亚马逊 S3 bucket 中的文件路径包含 /cfx/st。更多信息请参考 配置媒体播放器。MPEG-4 文件名一些播放器需要在文件名前加上 mp4:。一些播放器也可能会要求你去掉 .mp4 后缀。更多信息请参考 MPEG 文件。防火墙打开 1935 端口Adobe Flash Media Server 为 RTMP 使用了 1935 端口。确保你的防火墙已将将这一端口打开。如果没有打开的话,典型的消息返回是为 "Unable to play video."。当然你也可以切换到 RTMPT 通过使用端口 80 的 HTTP 隧道侍服。Adobe Flash Player 消息

在默认情况下,当要播放的视频文件缺失 Adobe Flash Player 并不显示任何消息。相反,它在等待该文件的出现。你可以改变它的这一表现以给你的终端客户一个更好的体验。

要使播放器在视频缺失时给一个消息,使用 play("vid",0,-1) 取代 play("vid")。



原文链接:http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/WorkingWithStreamingDistributions.html。
0 0
原创粉丝点击