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

时间:2010-03-09 10:21:02

标签: rtp rtsp

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

我想在我的服务器上终止UDP支持,但所有客户端首先尝试通过UDP设置会话,之后他们通过TCP进行会话...我想尽快将它们切换到TCP RTSP协议。

我该怎么做?

6 个答案:

答案 0 :(得分:7)

据我所知,服务器端无法控制传输类型首选项。服务器应该是通用的,它应该支持UDP上的RTP,TCP上的RTP,RTSP上的RTP和HTTP上的RTSP上的RTP(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请求(不是理想情况)。

答案 1 :(得分:7)

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

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

此处详细说明了所有其他回复:http://www.ietf.org/rfc/rfc2326.txt

答案 2 :(得分:4)

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

但我不确定它会对所有其他玩家有效,因为这是一个黑客攻击。

还有其他想法吗? = |

答案 3 :(得分:3)

如果您使用了ffmpeg,则可以强制切换rtsp传输层协议。

av_dict_set(&format_opts, "rtsp_transport", "tcp", 0);
err = avformat_open_input(&ic, is->filename, is->iformat, &format_opts);

答案 4 :(得分:1)

哪个客户端连接到您的服务器?可以通过URL中的URI方法触发某些客户端。例如,您可以指定rtspt://myhost/path.sdp。

如果您可以控制客户端/服务器,则可以在客户端上使用Require标头,在服务器上使用Unsupported,以指示不支持UDP;但我见过的大多数客户都没有使用它。

答案 5 :(得分:1)

您可以尝试在对Describe请求的响应中传递“transport”标头,并声明您的服务器仅支持RTP / AVP / TCP传输,并且客户端应该知道UDP不受支持。