如果客户端想观看我RTSP服务器上的流,它首先尝试通过UDP协议设置流。我如何告诉它我的服务器仅支持RTP / AVP / TCP,并且应该切换传输方式?
我想在我的服务器上终止UDP支持,但所有客户端都会首先尝试通过UDP设置会话,然后再通过TCP进行设置... 我想尽快在RTSP协议中将它们切换到TCP。我该怎么做?
我想在我的服务器上终止UDP支持,但所有客户端都会首先尝试通过UDP设置会话,然后再通过TCP进行设置... 我想尽快在RTSP协议中将它们切换到TCP。我该怎么做?
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) RTP通过RTSP和RTP通过RTSP通过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
我们可以看到,“传输类型”请求是由客户端发送的。
如果您想支持仅TCP服务器,则可以像您建议的那样,在SETUP请求的响应中发送“400 Bad Request”或“461 Unsupported transport”,或者另一种方法是发送200 OK,但不传输任何RTP数据包。客户端将超时并知道它在代理后面,并再次发送带有RTP / AVP / TCP参数的SETUP请求(这不是理想情况)。
如果您使用的是ffmpeg,您可以强制切换rtsp传输层协议。
av_dict_set(&format_opts, "rtsp_transport", "tcp", 0);
err = avformat_open_input(&ic, is->filename, is->iformat, &format_opts);
好的,一种方法是向客户端的SETUP请求发送“400 Bad Request”作为响应...然后它会自动切换到TCP协议。这适用于RealOne和QuickTime。
但我不确定它是否适用于所有其他播放器,因为这是一种hack方法。
还有其他想法吗?=|
什么客户端连接到您的服务器?一些客户端可以通过URL中的URI方法触发。例如,您可以指定rtspt://myhost/path.sdp。
如果您对客户端/服务器有控制权,则可以在客户端上使用Require标头,在服务器上使用Unsupported标头来指示不支持UDP;但我见过的大多数客户端都没有使用此功能。