flash - AS3,NetConnection/NetStream : Is there a smart way to split source url?

标签 flash actionscript-3 apache-flex netstream netconnection

问题

我必须更换 mx:VideoDisplay 现有 Flex 项目中的组件与自定义组件。

为了实现这一点,我必须符合其当前接口(interface),因此我的组件以以下任一形式接收视频网址(通过源参数):

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

  • 我的新组件基于 NetConnection 和 NetStream。对于上面的任何条目,我必须将输入分成两个字符串:一个用于 NetConnection.connect(NetConnectionStr) 方法,另一个用于 NetStream.play(NetStreamStr) 方法。例如:
  • 给定 /data/myflvfile.flv 然后:
  • NetConnectionStr =
  • NetStreamStr = "/data/myflvfile"
  • 给定 rtmp://streamcloud.myserver.com/cfx/st/somedirectory/myflvfile.flv 然后:
  • NetConnectionStr = “rtmp://streamcloud.myserver.com/cfx/st”
  • NetStreamStr = “某个目录/myflvfile”
  • 给定 rtmp://streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv 然后:
  • NetConnectionStr = “rtmp://streamcloud.myserver.com/cfx/st”
  • NetStreamStr = “某个目录/子目录/myflvfile”

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

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

    解决策略

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

    由于 NetConnection 似乎足够“智能”,我的第一次尝试是使用完整的源 url 调用连接方法。例如,给定
    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 )

  • 然后我希望以某种方式检索服务器的“真实”网址( 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( 子目录/myflvfile ) 失败
  • 尝试 3: stream.play( somedirectory/subdirectory/myflvfile ) 成功

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

    更好的解决方案?

    有什么好的方法可以解决这个问题吗?有谁知道他们在原始 VideoDisplay 组件中是如何做的(如果它基于 NetConnection/NetStream 对象?)?

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

    最佳答案

    var match:Array = path.match('rtmp://(.*/.*/.*/)');
    var server:String = match[0];
    var file:String = removeExtension(path.replace(match[1], ''));
    var channel:String = removeExtension(path.replace(match[2], ''));
    

    引用:http://onyx-vj.googlecode.com/svn/trunk/Onyx-VJ%203.0.0/OnyxCore/onyx/core/ProtocolRTMP.as

    关于flash - AS3,NetConnection/NetStream : Is there a smart way to split source url?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8228501/

    相关文章:

    css - 使用 CSS 使禁用的 Flex Spark 按钮更具可读性

    javascript - Polymer JS Polyfill 和 flash 兼容性

    actionscript-3 - 以编程方式添加属性来执行ActionScript对象(元编程)

    apache-flex - 从 AmazonS3 加载 swf - 跨域策略

    java - 更适合我的情况的技术 - Adob​​e/AIR/Flex 还是 Google SDK?

    actionscript-3 - Flex/ActionScript 中的字典

    Java、BlazeDS、Flex - 错误 #10566 : Cannot create property smallMessage on AcknowledgeMessage?

    actionscript-3 - 使用AS3和Youtube API在Flash电影中单击按钮后播放youtube

    apache-flex - Flex 中的 JSON。 "Access of undefined property JSON"

    apache-flex - 我应该使用哪个版本的 Flex SDK 来支持 Flash Player10.0?