如果客户端想要观看我的RTSP服务器上的流,它首先会尝试通过UDP协议设置流。我怎么能告诉它我的服务器只支持RTP/AVP/TCP,它应该切换传输?
我想在我的服务器上终止UDP支持,但所有客户端首先尝试通过UDP建立会话,然后通过TCP建立会话……并且我想在RTSP协议中尽快将它们转换成TCP。
我该怎么做呢?
发布于 2010-03-09 18:40:35
OK,一种方法是发送"400 Bad Request“作为对客户端设置请求的响应……并自动切换到TCP协议。这是针对RealOne和QuickTime的。
但我不确定它是否适用于所有其他玩家,因为这是一个黑客攻击。
还有其他的想法吗?
发布于 2010-08-21 16:43:35
据我所知,服务器端没有对传输类型首选项的控制。服务器应该是通用的它应该支持RTP over UDP,RTP over TCP,RTP over RTSP和RTP over RTSP over HTTP(S)。它的客户选择选择哪种传输方式。首先在设置请求中发送传输字段
1) UDP
C->A: SETUP rtsp://audio.example.com/twister/audio.en RTSP/1.0
CSeq: 1
Transport: RTP/AVP/UDP;unicast;client_port=3056-30572) TCP
C->A: SETUP rtsp://audio.example.com/twister/audio.en RTSP/1.0
CSeq: 1
Transport: RTP/AVP/TCP;unicast;client_port=3056-30573) RTP over RTSP和RTP over RTSP over HTTP(S)
S->C: RTSP/1.0 200 OK
CSeq: 2
Date: 05 Jun 1997 18:57:18 GMT
Transport: RTP/AVP/TCP;interleaved=0-1我们可以看到,"Transport type“请求是由客户端发送的。
如果你想只支持TCP服务器,你可以按照你的建议发送"400 Bad Request“或"461 Unsupported transport”来响应SETUP请求,或者另一种方式是发送200OK但不传输任何RTP数据包。客户端将超时并知道它落后于代理,并且它将再次发送带有RTP/AVP/TCP参数的设置请求(不是理想情况)。
发布于 2012-03-19 04:10:46
为了扩展android的答案,对于Android客户端,他们总是会首先尝试建立UDP连接。
对于OpenCore和StageFright,我可以确认,如果我从我的服务器返回"461不支持的传输“,以响应第一个用于UDP传输的设置请求,那么这两个客户端将立即尝试通过RTSP端口建立基于TCP的连接。
所有其他响应都在这里详细介绍:http://www.ietf.org/rfc/rfc2326.txt
https://stackoverflow.com/questions/2408233
复制相似问题