彗星DNS优化器
如何让rtmp协议通过http代理
sylilzy@ 施祖阳
2010-5-7 23:3:50 星期五
对于通过http代理上网的用户,如果想通过rtmp观看flash的视频流,应该如何做到.通过查找文档和分析,发现是可行的,下面介绍方法.
1.创建连接时的NetConnection对象的proxyType属性设置为"CONNECT"
2.调用connect方法时的URL,最好指定为rtmpt://localhost/...
3.运行程序时需要将IE的代理设置为正确的IP和端口
采用以上方式连接时,在使用代理服务器的情况下可正常播放视频,也就是说,只要通过代理能正常上网,则播放视频就没问题.这对于公司内网限制,或者有防火墙的环境下特别有用.
如果不使用代理,网络也可正常出公网的情况下,采用这种方法也可正常播放视频.可见这种方法是一种兼容性比较好的方法.
另外,对于各种rtmp协议,作如下说明:
RTMP Real-Time Messaging Protocol
RTMPT Real-Time Messaging Protocol tunneled over HTTP
RTMPE 128-bit encrypted Real-Time Messaging Protocol
RTMPTE 128-bit encrypted Real-Time Messaging Protocol tunnelled over HTTP
RTMPS Real-Time Messaging Protocol over SSL
注意,只有flash player 9 update 3和fms3才支持rtmpte
对于proxyType,补充文档说明:
确定是否将本机 SSL 用于 RTMPS 而不是用于 HTTPS,以及是否使用建立隧道的 CONNECT 方法通过代理服务器进行连接。 可接受的值为“none”、“HTTP”、“CONNECT”、和“best”。 此属性用于 Flex 应用程序和 Flash Media Server 2 应用程序。
在 Flash Player 9 中,仅当使用 RTMP、RTMPS 或 RTMPT 时,此属性才可用。 CONNECT 方法仅适用于通过代理服务器连接到网络的用户。
proxyType 属性可确定初始连接尝试失败后应使用的后备方法。 必须在调用 NetConnection.connect() 方法之前设置 proxyType 属性。 此属性可确定是否尝试使用本机传输层安全 (TLS),以及在应用程序尝试连接时如果遇到代理服务器应如何与之协同工作。
在 Flash Player 9 中,此属性的默认值为“none”;如果未更改此值,Flash Player 将针对 RTMPS 使用 HTTPS 隧道。 如果将此属性设置为“best”,则将建立最佳连接方法并首先尝试最佳方法,如果失败则使用其它备用方法。 对于 RTMPS 连接,默认情况下使用本机 SSL 套接字,如有必要则使用其它备用方法。 如果将此属性设为“HTTP”并且直接连接失败,则将使用 HTTP 隧道的旧方法。 如果将此属性设为“CONNECT”并且直接连接失败,则将使用隧道的 CONNECT 方法。 如果后者也失败,连接不会使用备用的 HTTP 隧道方法。
另外,对于connectedProxyType属性,作如下说明:
connectedProxyType表示:
如果连接成功,则指示使用的是哪种连接方法:直接连接、CONNECT 方法还是 HTTP 隧道。 可能
的值包括“none”、“HTTP”、“HTTPS”和“CONNECT”。 此属性仅在连接了 NetConnection 对象时有效。 此属性用于 Flex 应用程序和 Flash Media Server 应用程序。 在 Flash Player 9 中,仅当使用 RTMP、RTMPS 或 RTMPT 时,此属性才可用。 CONNECT 方法仅适用于通过代理服务器连接到网络的用户。
可以读取此属性以确定使用的是哪种连接方法。 如果使用的是直接连接方法,则此属性返回“none”;如果使用的是 HTTP 隧道方法,则此属性返回“HTTP”;如果使用的是安全 HTTPS 隧道方法,则此属性返回“HTTPS”;如果使用的是代理 CONNECT 方法,则此属性返回“CONNECT”。
对于rtmp连接如果未指定端口,则按如下顺序尝试:
my_nc.connect("rtmp://myserver/myapp"); // uses the default port 1935
my_nc.connect("rtmp://myserver:443/myapp");
my_nc.connect("rtmp://myserver:80/myapp");
my_nc.connect("rtmpt://myserver:80/myapp");