AS3,NetConnection / NetStream:是否有一种聪明的方法来拆分源URL?

8

问题

我需要在一个现有的Flex项目中用自定义组件替换mx:VideoDisplay组件。

为了实现这一点,我必须遵守其当前接口,因此我的组件通过source参数以以下形式接收视频url:

  1. /data/myflvfile.flv(如果文件是本地播放)
  2. rtmp://streamcloud.myserver.com/cfx/st/somedirectory/myflvfile.flv(如果文件从Cloudfront流式传输)

我的新组件基于NetConnection和NetStream。针对上述任何条目,我都必须将输入拆分为两个字符串:一个用于NetConnection.connect(NetConnectionStr)方法,另一个用于NetStream.play(NetStreamStr)方法。例如:

  1. 给定/data/myflvfile.flv,则:
    • NetConnectionStr = null
    • NetStreamStr = "/data/myflvfile"
  2. 给定rtmp://streamcloud.myserver.com/cfx/st/somedirectory/myflvfile.flv,则:
    • NetConnectionStr = "rtmp://streamcloud.myserver.com/cfx/st"
    • NetStreamStr = "somedirectory/myflvfile"
  3. 给定rtmp://streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv,则:
    • NetConnectionStr = "rtmp://streamcloud.myserver.com/cfx/st"
    • NetStreamStr = "somedirectory/subdirectory/myflvfile"

对于“本地文件”情况,构建这两个字符串非常明显,但在其他情况下就会变得棘手。问题在于我没有聪明的方法来猜测输入的哪一部分是服务器URL,哪一部分是流名称+目录结构。

在互联网上找到的一些示例中,人们只是猜测源的最后一部分(最后一个“/”之后的内容)是NetStream名称。在我的情况下,这并不总是正确的,因为流可能在服务器的子目录中。更糟糕的是,服务器名称可能包含“/”字符!

解决策略

连接到服务器,检索其真实URL,找到流名称

由于NetConnection似乎足够“聪明”,因此我的第一次尝试是使用完整的源URL调用connect方法。例如,给定rtmp://streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv

NetConnection成功连接:

  • connection.connect(rtmp://streamcloud.myserver.com/cfx/st/)
  • connection.connect(rtmp://streamcloud.myserver.com/cfx/st/somedirectory/)
  • ...
  • connection.connect(rtmp://streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv)

然后我希望以某种方式检索服务器的“真实”url (rtmp://streamcloud.myserver.com/cfx/st),这样我就能猜测流部分 (somedirectory/subdirectory/myflvfile)。

不幸的是,我没有找到从NetConnection对象中获取真实服务器地址的方法(connection.uri返回输入的确切值)。因此,这似乎是一个死胡同。

连接到服务器,迭代检索流

另一种策略可能是连接到服务器,然后尝试迭代地播放流,直到成功为止(从最后开始):

给定rtmp://streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv

  • 尝试1:stream.play(myflvfile)失败
  • 尝试2:stream.play(subdirectory/myflvfile)失败
  • 尝试3:stream.play(somedirectory/subdirectory/myflvfile)成功

但这是一种非常丑陋的方法,我正在寻找更好的解决方案。

更好的解决方案?

有没有好的方法来解决这个问题?有人知道他们在原始VideoDisplay组件中如何处理(如果它基于NetConnection/NetStream对象)吗?

感谢您提前对此问题的任何帮助和/或评论 :)


谢谢您的评论!我已经尽可能清楚地表达了... - Elsener
3个回答

0

没有对运行中的rtmp服务测试解决方案,很难绝对验证,但请考虑以下对第二种策略的改进:

  • 像平常一样创建NetConnection

  • 在第一次connect()成功后,迭代可能的服务和资产组合(例如:"rtmp://streamcloud.myserver.com/cfx/" & "/st/somedirectory/subdirectory/myflvfile.flv"等),并为每个组合创建并发的NetStreams -- 这样您就不必等待顺序发现

  • 如果其中一个NetStream分派了成功事件,请将其附加到显示器上,并将所有其他NetStream丢弃(它们可能会失败)

  • 可选地,您可以存储成功的服务/资产对,以加快连接重用时的速度

这似乎是一个令人烦恼的问题!


0

我对你的问题感到困惑。你的rtmp连接没有任何一部分是一致的吗?你经常更换流媒体提供商吗?如果这是一致的,那么至少已经赢得了一半的胜利。我连接到rtmp的方式始终相同。后面的部分更加动态,以相同的方式传递; [文件夹空间]/[视频名称]。我将仅对传入的内容进行解析,但我只有一个单一的rtmp提供商。


0

非常感谢您的回答!不幸的是,在路径分隔符上进行模式匹配不是一个有效的选项。情况2.(_rtmp://streamcloud.myserver.com/cfx/st/somedirectory/myflvfile.flv_)和情况3.(_rtmp://streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv_)失败,因为没有办法猜测“/”是服务器URL的一部分还是流路径的一部分。这个问题主要是由于服务器和流中都可能有“/”,并且需要提供从服务器根目录到NetStream对象的精确路径所致。 - Elsener

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