问题
我必须使用自定义组件替换现有Flex项目中的mx:VideoDisplay组件.
为了实现这一点,我必须符合其当前的接口,因此我的组件以以下形式接收视频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(子目录/ myflvfile)失败
- 尝试3: stream.play(somedirectory/subdirectory/myflvfile …