3

我已经设置了一个带有下载和流式分发的云端实例。我使用签名的网址将两者都设置为私有。我能够获得适用于带有签名网址的图像的下载分发的示例代码。我现在正试图让带有签名 URL 的 JW Player 的流媒体分发工作,但我遇到了问题。

Here is my signed URL format: 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 播放器代码:

<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

4

1 回答 1

9

这里有很多陷阱。当我进入它时,我花了一段时间来完成它们。以下是我认为可能对很多人有帮助的一些步骤。

首先是我使用的技术堆栈:

  • 导轨 3.x
  • Zencoder 用于编码
  • 用于文件上传的回形针
  • 用于上传的 Jquery Uload
  • JWPlayer

如果那不是你的平台,你可以填补一些空白,但很多学习对你仍然有用。

有很多关于如何将内容从用户上传到 S3 的文章,所以我将跳过该部分,有趣的部分是当您开始编码过程时,这实际上是问题开始的地方,涉及签名、流式传输在 jwplayer 或 flowplayer 中播放的内容。

首先,文件格式——我发现 MP4 和 M4A 是我最成功的文件格式。使用 zencoder,我能够使用开箱即用的 mp4 和 m4a 导出格式并让这些输出正常播放。

  1. 在设置云端分发之前,将您的 zencoder 策略添加到存储桶中。
  2. 如果您已经配置了 cloudfront,那么您应该小心如何将 zencoder 存储桶策略添加到存储桶中,并确保将其与那里的任何内容合并。Cloudfront 还将内容放入存储桶策略中,您需要这个和 zencoder 存储桶策略配置文件才能正常工作。

  3. 存储桶策略仅适用于存储桶所有者拥有的文件,因此请务必与您的编码提供商联系,以确保他们使用您的访问密钥将文件放在云端。如果您没有让用户与在 S3 中拥有该文件的用户一样进行签名,它将无法正常工作,您将花费数小时想知道为什么

  4. 一旦您确定您的存储桶设置正确,在进一步使用此工具来帮助验证您的文件将实际流式传输之前(开始时没有签名的 url 并允许云端流式传输未流式传输的文件。如果这不起作用你不会走远)。

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

    要使用 amazons 工具,如果您的 rtmp url 是:

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

    对于您要输入的流式传输网址:

    s3b78u0kbtx79q.cloudfront.net

    对于您要输入的视频文件名:

    content/myfile.png(没有前导的'/')

  5. 一旦您实际上可以通过诊断工具从亚马逊流式传输您的文件,现在继续执行您从 flowplayer 的 jwplayer 获得的任何步骤。

  6. 关于在流式传输时设置 JWPlayer(我遇到的问题最少)的注意事项 - 还要安装调试版本的 flash。现在在调试期间,您可以右键单击闪存控件并将日志记录更改为“控制台”。现在你会从出现在 Firebug 中的 flash 控件中得到任何加载错误 - 所以可能先用 Firefox 进行测试。通常,在查看这些日志时,您不希望任何 html 控制字符被转义,转义通常会毁了您的一天。

  7. 我想很多这样做的人会希望他们的内容安全并使用签名的 url(这样可疑的其他人不会只是撕掉你的 rtmp 路径并将其直接嵌入到他们的网站中,在你支付带宽的同时获得好处)。我可以不要强调这一点,在开始走这条路之前,请确保首先让您的 RTMP 流在您的云端存储桶中的公共流文件上播放,这样您就知道该机制正在工作。

  8. 如果你走到这一步,你就在一个好地方,但现在是所有错误都可能击中你的时候,如果你遵循我上面的建议,那将比你错过其中一个步骤更短的一天(比如确保你的存储桶策略包括您的 cloudfront origin id 和您的编码提供商以您的规范 id 作为所有者而不是他们的所有者写入文件)。

  9. 现在您已经通过 RTMP 将内容流式传输到播放器,接下来您将希望使其与签名 URL 一起工作(同样,因此其他站点不能只复制您的 RTMP 路径并通过他们自己的站点播放它并附加 jwplayer) . 至少在 Rails 中,生成签名 url 的最好方法是使用这个 gem:

    https://github.com/58bits/cloudfront-signer

    根据您嵌入 url 的方式,您将需要使用不同类型的转义。如果您的 URL 无法播放,请尝试以下操作(不是很精确,但如果您在这里并且失去了头发,您会尝试任何方法,如果您已经尝试过让这个工作,您可能已经知道我的意思并且不会暂时需要理发):

<%=  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 可以解决我所有的问题之前,我可能有一次搞砸了一个小时。

于 2013-02-11T22:11:00.743 回答