如果客户端想要观看我的 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) RTP over RTSP 和 RTP over RTSP over 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 的服务器,您可以发送“400 Bad Request”或“461 Unsupported transport”以响应您建议的 SETUP 请求,或者另一种方式是发送 200 OK 但不传输任何 RTP 数据包。客户端将超时并知道它在代理后面,它将使用 RTP/AVP/TCP 参数再次发送 SETUP 请求(不是理想情况)。
为了扩展 android 的答案,对于 Android 客户端,他们总是会首先尝试建立 UDP 连接。
对于 OpenCore 和 StageFright,我可以确认,如果我从服务器返回“461 Unsupported Transport”以响应 UDP 传输的第一个 SETUP 请求,那么这两个客户端将立即尝试通过 RTSP 端口建立基于 TCP 的连接。
所有其他回复都在此处详细说明:http ://www.ietf.org/rfc/rfc2326.txt
好的一种方法是发送“400 Bad Request”作为对客户端 SETUP 请求的响应......它会自动切换到 TCP 协议。这适用于 RealOne 和 QuickTime。
但我不确定它是否适用于所有其他玩家,因为这是一个 hack。
还有其他想法吗?=|
如果你用过ffmpeg,你可以强制切换rtsp传输层协议。
av_dict_set(&format_opts, "rtsp_transport", "tcp", 0);
err = avformat_open_input(&ic, is->filename, is->iformat, &format_opts);
什么客户端连接到您的服务器?有些客户端可以通过 URL 中的 URI 方法触发。例如,您可以指定 rtspt://myhost/path.sdp。
如果您可以控制客户端/服务器,则可以在客户端上使用 Require 标头,在服务器上使用 Unsupported 来指示不支持 UDP;但我见过的大多数客户都不使用它。
您可以尝试在对描述请求的响应中传递“传输”标头,并在此处声明您的服务器仅支持 RTP/AVP/TCP 传输,并且客户端应该知道不支持 UDP。