AWS Cloudfront使用签名URL进行流媒体传输

3

我已经设置了一个带有下载和流媒体分发的CloudFront实例。 我将两者都设置为私有,并使用签名URL。 我已能够让示例代码在具有签名URL的图像下载分发上正常工作。 现在,我正在尝试使用签名URL使JW Player与流媒体分发一起工作,但我遇到了问题。

这是我的签名URL格式:     rtmp://s1iq2cbtodqqky.cloudfront.net/2012-08-31_13-24-01_534.mp4?Expires=1359648770&Signature=Oi8RwL4Nf338NldW2uIsqFIv3zHnJkxXYbXIiVQh~J0Iq4kb00Ly5MLTgJw~87KmlUOmilmdRHy7p~UxeGYQxgkewPI11r27se0b~hTvpxq9y9Z5C-B-A58ZnngaCi9G2SHAujMzvss7ynLLEqUV3M6MVZl1qCxyfJbLdxCIEMY_&Key-Pair-Id =

这是我的JW Player代码:

<script type="text/javascript" src="jwplayer/jwplayer.js"></script>
<div id="container">Loading the player ...</div>
<script type="text/javascript">
jwplayer("container").setup({
'flashplayer': 'jwplayer/jwplayer.flash.swf',
'file': '<?= $canned_policy_stream_name ?>',
'width': '480','height': '270',
'provider': 'rtmp',
'streamer': 'rtmp://s1iq2cbtodqqky.cloudfront.net/cfx/st/'

});
</script>

有人知道这里出了什么问题吗?我该如何测试单独的url?现在很难确定问题是url还是JW Player集成代码。

-J


注意:我已删除付费ID密钥,我收到的错误是“加载播放器时出错:找不到可播放的来源”。 - JT_Dylan
你有问题发生的链接吗? - emaxsaun
我能看到你在哪里运行这个播放器吗? - emaxsaun
我看到了一个带有该URL的“服务器上未找到ID”消息,但你确定文件确实存在吗? - emaxsaun
我以前从未使用过AWS,但我们这里确实有一些旧文档:http://www.longtailvideo.com/support/jw-player/jw-player-for-flash-v4/25/using-amazon-web-serviceshttp://www.longtailvideo.com/support/jw-player/jw-player-for-flash-v5/49/using-cloudfront - emaxsaun
显示剩余4条评论
1个回答

9
这里有很多需要注意的地方。当我开始接触时,花费了一些时间来解决这些问题。以下是我认为可能会帮助很多人的一些步骤。
首先,这是我使用的技术栈:
- Rails 3.x - Zencoder用于编码 - Paperclip用于文件上传 - Jquery Uload用于上传 - JWPlayer 如果这不是你的平台,你可以填补一些空白,但很多学习仍然对你有用。
有很多文章介绍如何将内容上传到S3,因此我将跳过该部分。真正有趣的是当您开始编码过程时,即在获取已签名、流式传输的内容以在jwplayer或flowplayer中播放方面出现的问题。
首先,文件格式 - 我发现MP4和M4A是我最成功的文件格式。使用zencoder,我能够使用开箱即用的mp4和m4a导出格式,并且能够成功播放这些输出。
  1. 在设置CloudFront分发之前,将您的zencoder策略添加到存储桶中。
  2. 如果您已经配置了CloudFront,则在向存储桶中添加zencoder存储桶策略时应当小心,并确保将其与现有内容合并。CloudFront还会将一些内容放入存储桶策略中,您需要同时使用这两个策略才能正确工作。

  3. 存储桶策略仅适用于存储桶所有者拥有的文件,因此请务必与编码提供商联系,以确保他们使用您的访问密钥将文件放入CloudFront中。如果签名的用户与S3中拥有文件的用户不同,则无法正常工作,您将花费数小时的时间想知道原因。

  4. 一旦您确定已正确设置存储桶,请在进一步操作之前使用此工具来帮助验证您的文件是否实际上会流式传输(首先不要使用签名URL并允许CloudFront流式传输未流式传输的文件。如果这样做不起作用,则无法继续下去)。

    http://d1k5ny0m6d4zlj.cloudfront.net/diag/CFStreamingDiag.html

    要使用Amazon的工具,请输入以下内容:

    如果您的RTMP URL是:

    "rtmp://s3b78u0kbtx79q.cloudfront.net/cfx/st/content/myfile.png"

    您要输入的流式传输URL是:

    s3b78u0kbtx79q.cloudfront.net

    您要输入的视频文件名是:

    content/myfile.png(不包括前导“/”)

  5. 一旦您可以通过诊断工具从Amazon实际流式传输文件,现在就可以按照jwplayer或flowplayer的步骤进行操作了。

  6. 关于设置JWPlayer(我遇到的问题最少)的注意事项 - 同时安装调试版本的Flash。现在,在调试期间,您可以右键单击Flash控件并将日志记录更改为“控制台”。现在,您将在Firebug中看到来自Flash控件的任何加载错误 - 因此可能首先使用Firefox进行测试。通常,在查看这些日志时,您不希望任何HTML控件字符被转义,转义通常会破坏您的一天。

  7. 我想很多人在做这个的时候都希望他们的内容是安全的,并且使用签名URL(这样可疑的其他人就不能只是复制您的RTMP路径并将其直接嵌入其站点中,从而获得您支付带宽的好处)。我无法强调这一点足够了,在开始这条路之前,请确保您首先将RTMP流播放到公开流传输文件中,以便您知道机制是否有效。

  8. 如果您已经走到这一步,那么现在所有的错误都可能会发生,如果您遵循了我上面的建议,那么您的时间会比错过其中一个步骤(例如确保您的存储桶策略包括您的CloudFront源ID和您的编码提供商使用您的规范ID作为所有者而不是他们的规范ID)更短。

  9. 现在,您的内容通过RTMP流式传输到播放器,接下来您将想要使用

    <%=  AWS::CF::Signer.sign_path 'path/to/my/content', :expires => Time.now + 600 %>
    <%=raw AWS::CF::Signer.sign_path 'path/to/my/content', :expires => Time.now + 600 %>
    
    <%=  AWS::CF::Signer.sign_path_safe 'path/to/my/content', :expires => Time.now + 600 %>
    <%=raw AWS::CF::Signer.sign_path_safe 'path/to/my/content', :expires => Time.now + 600 %>
    

    我可能曾经浪费了一个小时的时间,直到发现使用raw可以解决我所有的问题。


在第三点上,对于zencoder:这可以通过在您的zencoder帐户配置文件中设置Access Key ID和Secret Access Key来实现。 - matb33
“确保您首先在公开流式传输文件中获取您的RTMP流,以便您知道机制正在工作。”非常明智的建议。现在我已经让第一部分工作了。接下来是下一步。 - frostymarvelous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接