如何强制客户端将RTP传输从UDP切换到TCP?

Cip*_*ipi 7 rtp rtsp

如果客户端想要观看我的RTSP服务器上的流,它首先尝试通过UDP协议设置流.我怎么能告诉它我的服务器只支持RTP/AVP/TCP并且它应该切换传输?

我要终止我的服务器上的UDP支持,但所有的客户端第一次尝试设置了UDP会话,后来他们通过TCP这样做......我想切换他们尽快在RTSP协议TCP.

我怎样才能做到这一点?

Ala*_*lam 7

据我所知,服务器端没有控制传输类型的优先级.服务器应该是通用的,它应该支持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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我们可以看到客户端发送"传输类型"请求.

如果您想支持仅TCP服务器,您可以发送"400 Bad Request"或"461 Unsupported transport"以响应您建议的SETUP请求,或者另一种方式是发送200 OK但不发送任何RTP数据包.客户端将超时并且知道它在代理之后,它将使用RTP/AVP/TCP参数再次发送SETUP请求(不是理想情况).


ian*_*obo 7

为了扩展Android的答案,对于Android客户端,他们将始终首先尝试建立UDP连接.

对于OpenCore和StageFright,我可以确认,如果我从服务器返回"461 Unsupported Transport"以响应第一个SETUP请求进行UDP传输,则这两个客户端将立即尝试通过RTSP端口建立基于TCP的连接.

所有其他回复详述如下:http://www.ietf.org/rfc/rfc2326.txt


Cip*_*ipi 4

好的一种方法是发送“400 Bad Request”作为对客户端 SETUP 请求的响应...并且它会自动切换到 TCP 协议。这适用于 RealOne 和 QuickTime。

但我不确定它是否适用于所有其他玩家,因为这是一个黑客行为。

还有其他想法吗?=|