问题
我需要在一个现有的Flex项目中用自定义组件替换mx:VideoDisplay组件。
为了实现这一点,我必须遵守其当前接口,因此我的组件通过source参数以以下形式接收视频url:
- /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 = null
- NetStreamStr = "/data/myflvfile"
- 给定rtmp://streamcloud.myserver.com/cfx/st/somedirectory/myflvfile.flv,则:
- NetConnectionStr = "rtmp://streamcloud.myserver.com/cfx/st"
- NetStreamStr = "somedirectory/myflvfile"
- 给定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对象)吗?
感谢您提前对此问题的任何帮助和/或评论 :)