如果客户端想要观看我的RTSP服务器上的流,它首先尝试通过UDP协议设置流。我怎么能告诉它我的服务器只支持RTP / AVP / TCP并且它应该切换传输?
我想在我的服务器上终止UDP支持,但所有客户端首先尝试通过UDP设置会话,之后他们通过TCP进行会话...我想尽快将它们切换到TCP RTSP协议。
我该怎么做?
答案 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不受支持。