我正在尝试使用代理通过HTTP获取RTSP流。Real客户端的行为似乎有点混乱:它同时尝试所有可能的端口、方法和协议。唯一有效的方法是通过80端口进行HTTP GET请求。确实发出了这样的请求,并在服务器上接收到。以下是代理向服务器发送请求时的样子:
在这一点上,服务器传来了另外4个字节(它们的值为48 02 02 00)- 就是这样,没有更多的内容。此时,服务器是否期望客户端做出任何回应?如果是,该做什么?这种操作模式是否有效?
关于这个问题的一些更多信息:显然,RealPlayer内置的通过HTTP使用RTSP的机制的预期工作方式如下:
GET /SmpDsBhgRl83c52ef2-d0f4-41ac-bada-93e5350f67d1?1="1" HTTP/1.0\r\n
Connection: Keep-Alive\r\n
Host: 10.194.5.162:80\r\n
Pragma: no-cache\r\n
User-Agent: RealPlayer G2\r\n
Expires: Mon, 18 May 1974 00:00:00 GMT\r\n
Accept: application/x-rtsp-tunnelled, */*\r\n
ClientID: WinNT_5.1_6.0.14.806_RealPlayer_R41UKD_en-GB_686\r\n
X-Actual-URL: rtsp://10.194.5.162:554/01.mp3\r\n
\r\n
这是服务器的响应:
HTTP/1.0 200 OK\r\n
Server: RMServer 1.0\r\n
Expires: Mon, 18 May 1974 00:00:00 GMT\r\n
Pragma: no-cache\r\n
x-server-ipaddress: 10.194.5.162\r\n
Content-type: audio/x-pn-realaudio\r\n
\r\n
在这一点上,服务器传来了另外4个字节(它们的值为48 02 02 00)- 就是这样,没有更多的内容。此时,服务器是否期望客户端做出任何回应?如果是,该做什么?这种操作模式是否有效?
关于这个问题的一些更多信息:显然,RealPlayer内置的通过HTTP使用RTSP的机制的预期工作方式如下:
- 尝试连接以下端口:80、8080、554、7070。(也可以直接尝试通过在端口80上发出GET请求http://hostname:port/mediafilename以直接下载文件)
- 对于以上每个端口,创建2个连接。
- 向其中一个连接发送GET请求到url http://hostname:port/SmpDsBhgRl
<guid>
?1="1",其中<guid>
是新创建的GUID。添加一个名为X-Actual-URL的头部到此请求中,其中包含原始的RTSP URL。 - 在另一个连接上向URL http://hostname:port/SmpDsBhgRl 发送POST请求,并将上述GUID作为请求体的一部分发送。发送32767字节的Content-Length头部,以防止代理过早地关闭连接。
- 开始通过POST请求向服务器发出命令,并在GET响应中获取相应的RTSP流。
更新#2:这里是RealPlayer的源代码,解释了上述行为。尽管如此,仍然没有解决方案。
更新#3:好吧,在上面的情况下,48 02 02 00的魔术值是清晰的:48 == 'h'代表HTTP_RESPONSE
,下一个02是以下数据的长度,下一个02被称为POST_NOT_RECEIVED
(意思是POST请求在相应的GET请求后一秒钟内未到达服务器)。
更新 #4:这种行为(即使用巨大Content-Length的POST请求)也是WebEx使用的ActiveX的特征(以及可能许多其他需要与服务器建立打开通道的网络应用程序的特征)。