我想通过使用代理的HTTP获取RTSP流。 Real客户端的行为似乎有点紧张:它一次尝试所有可能的端口,方法和协议。唯一可行的是通过端口80的HTTP GET。这样的请求确实发出,并在服务器上被接收。下面是当它由代理向服务器发送请求的外观:rtsp通过代理上的http
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) - 就是这样,没有更多。服务器是否期望客户端的任何内容,如果是的话 - 是什么?这种操作模式是否可以工作?
对这个问题的一些详细信息:显然,与RTSP通过HTTP内置的RealPlayer工作的打算机制如下:
- 尝试连接到以下端口:80,8080,554,7070 。 (也尝试直接下载文件,只为它赫克,通过发出GET端口80 http://hostname:port/mediafilename)
- 对于上述每个端口,创建2个连接。
- 发送GET请求到其中一个到url的连接http://hostname:port/SmpDsBhgRl
<guid>
?1 =“1”,其中<guid>
是,是,新创建的GUID。为此请求添加一个名为X-Actual-URL的标题,其中包含原始RTSP URL。 - 在其他连接上发送POST请求,并将上面的GUID作为请求主体的一部分加入到URL http://hostname:port/SmpDsBhgRl中。发送32767字节的内容长度标头,以防止代理过早关闭连接。
- 开始通过POST请求向服务器发出命令,并获取相应的RTSP流作为GET响应的一部分。
奇怪的东西(如果上面不够奇怪)是,例如,它适用于Squid,但不是如果您使用任何端口3128或8080!不知何故,客户端使用它连接的端口来决定请求的顺序或取消请求的时间,但无论如何,尽管难以置信,但它可以与代理端口9090,3129,8081一起使用,但是不与3128或8080.
更新#2:Here是RealPlayer的来源,并解释了上述行为。但仍然没有解决方案。
更新#3:好的,鉴于上述情况,48 02 02 00的魔法值是清楚的:48 =='h'是HTTP_RESPONSE
,接下来的02是以下数据的长度,接下来的02被称为POST_NOT_RECEIVED
(意思是POST请求没有在相应的GET请求的一秒钟内到达服务器)。
更新#4:此行为(即具有巨大内容长度的POST请求)也是WebEx使用的ActiveX的特征(可能还有许多其他Web应用程序需要到服务器的开放通道)。
服务器的HTTP 200 OK响应是否有效?我的服务器用于响应您的情况,但RealPlayer在打开GET和POST连接后停止响应。然后,我添加到响应48 02 00 00和Content-Length:4属性的主体,它的工作原理...也许你需要修改你的HTTP OK响应并在收到POST连接后发送它,而不是在此之前。 – Cipi 2010-03-10 13:16:46