问题
我必须更换 mx:VideoDisplay 现有 Flex 项目中的组件与自定义组件。
为了实现这一点,我必须符合其当前接口(interface),因此我的组件以以下任一形式接收视频网址(通过源参数):
我的新组件基于 NetConnection 和 NetStream。对于上面的任何条目,我必须将输入分成两个字符串:一个用于 NetConnection.connect(NetConnectionStr) 方法,另一个用于 NetStream.play(NetStreamStr) 方法。例如:
对于“本地文件”情况,构建这两个字符串非常明显,但在其他情况下则变得棘手。问题是我没有聪明的方法来猜测输入的哪一部分是服务器 URL,哪一部分是流名称 + 目录结构。
在 Internet 上找到的一些示例中,人们只是猜测源的最后一部分(找到的最后一个“/”之后的部分)是 NetStream 名称。就我而言,这并不总是正确的,因为流可能位于服务器上的子目录中。更糟糕的是,服务器名称可能包含“/”字符!
解决策略
连接到服务器,检索其真实 URL,查找流名称
由于 NetConnection 似乎足够“智能”,我的第一次尝试是使用完整的源 url 调用连接方法。例如,给定
rtmp://streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv
NetConnection 在以下方面取得了成功:
然后我希望以某种方式检索服务器的“真实”网址( rtmp://streamcloud.myserver.com/cfx/st ),以便我能够猜测流部分( somedirectory/subdirectory/myflvfile )。
不幸的是,我发现无法从 NetConnection 对象中获取真实的服务器地址(connection.uri 返回准确的输入)。所以这似乎是一个死胡同。
连接到服务器,迭代检索流
另一种策略可能是连接到服务器,然后反复尝试(从最后开始)播放流,直到它工作:
给定 rtmp://streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv :
但这是一种非常丑陋的方式,我正在寻找更好的解决方案。
更好的解决方案?
有什么好的方法可以解决这个问题吗?有谁知道他们在原始 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/