加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash – AS3,NetConnection / NetStream:有没有一种智能的方法

发布时间:2020-12-15 07:31:39 所属栏目:百科 来源:网络整理
导读:问题 我必须使用自定义组件替换现有Flex项目中的mx:VideoDisplay组件. 为了实现这一点,我必须符合其当前的接口,因此我的组件以以下形式接收视频URL(通过源参数): /data/myflvfile.flv(如果文件在本地播放) rtmp://streamcloud.myserver.com/cfx/st/somedi
问题

我必须使用自定义组件替换现有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)成功

但这是一个非常难看的方式,我正在寻找一个更好的解决方案.

更好的解决方案?

有没有什么好方法可以解决这个问题?有谁知道他们是如何在原始的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],''));

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读