如果客户端想要观看我的RTSP服务器上的流,它首先尝试通过UDP协议设置流.我怎么能告诉它我的服务器只支持RTP/AVP/TCP并且它应该切换传输?
我要终止我的服务器上的UDP支持,但所有的客户端第一次尝试设置了UDP会话,后来他们通过TCP这样做......我想切换他们尽快在RTSP协议TCP.
我怎样才能做到这一点?
据我所知,服务器端没有控制传输类型的优先级.服务器应该是通用的,它应该支持RTP over UDP,RTP over TCP,RTP over RTSP和RTP over RTSP over HTTP(S).并且其客户选择哪种运输方式可供选择.传输字段首先在SETUP请求中发送
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-3057
2)TCP
C->A: SETUP rtsp://audio.example.com/twister/audio.en RTSP/1.0 CSeq: 1 Transport: RTP/AVP/TCP;unicast;client_port=3056-3057
3)RTSP上的RTP和HTTP上的RTSP上的RTP(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
我们可以看到客户端发送"传输类型"请求.
如果您想支持仅TCP服务器,您可以发送"400 Bad Request"或"461 Unsupported transport"以响应您建议的SETUP请求,或者另一种方式是发送200 OK但不发送任何RTP数据包.客户端将超时并且知道它在代理之后,它将使用RTP/AVP/TCP参数再次发送SETUP请求(不是理想情况).
为了扩展Android的答案,对于Android客户端,他们将始终首先尝试建立UDP连接.
对于OpenCore和StageFright,我可以确认,如果我从服务器返回"461 Unsupported Transport"以响应第一个SETUP请求进行UDP传输,则这两个客户端将立即尝试通过RTSP端口建立基于TCP的连接.
所有其他回复详述如下:http://www.ietf.org/rfc/rfc2326.txt