【发布时间】:2010-03-09 10:21:01
【问题描述】:
如果客户端想要观看我的 RTSP 服务器上的流,它首先尝试通过 UDP 协议设置流。我如何告诉它我的服务器只支持 RTP/AVP/TCP 并且它应该切换传输?
我想终止我的服务器上的 UDP 支持,但所有客户端首先尝试通过 UDP 建立会话,然后他们通过 TCP 这样做......我想尽快将它们切换到 TCP RTSP 协议。
我该怎么做?
【问题讨论】:
如果客户端想要观看我的 RTSP 服务器上的流,它首先尝试通过 UDP 协议设置流。我如何告诉它我的服务器只支持 RTP/AVP/TCP 并且它应该切换传输?
我想终止我的服务器上的 UDP 支持,但所有客户端首先尝试通过 UDP 建立会话,然后他们通过 TCP 这样做......我想尽快将它们切换到 TCP RTSP 协议。
我该怎么做?
【问题讨论】:
据我所知,服务器端无法控制传输类型首选项。服务器应该是通用的,它应该支持 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 端口。
所有其他回复都在此处详细说明: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;但我见过的大多数客户都不使用它。
【讨论】:
您可以尝试在对 Describe 请求的响应中传递“传输”标头,并在此处声明您的服务器仅支持 RTP/AVP/TCP 传输,并且客户端应该知道不支持 UDP。
【讨论】: