【问题标题】:How to force client to switch RTP transport from UDP to TCP?如何强制客户端将 RTP 传输从 UDP 切换到 TCP?
【发布时间】:2010-03-09 10:21:01
【问题描述】:

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

我想终止我的服务器上的 UDP 支持,但所有客户端首先尝试通过 UDP 建立会话,然后他们通过 TCP 这样做......我想尽快将它们切换到 TCP RTSP 协议。

我该怎么做?

【问题讨论】:

    标签: rtp rtsp


    【解决方案1】:

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

    【讨论】:

    • @Alam 先生,我在 live 555 的测试目录中使用 2 个 live555 程序“testMpeg2transportstreamer”,在 live 555 的代理服务器目录中使用代理服务器,我正在向代理服务器程序提供“testMpeg2transportstreamer”的 url " rtsp 服务器,现在我可以发送 C->A: SETUP rtsp://audio.example.com/twister/audio.en RTSP/1.0 CSeq: 1 Transport: RTP/AVP/TCP;unicast;client_port=3056- 3057 从代理服务器到“testMpeg2transportstreamer”请指导
    • @Alam 我希望 testMpeg2transportstreamer 仅流式传输 TCP 数据包,就像现在当我在 wireshark 中看到它流式传输 UDP 数据包时,我希望它传输我可以在 wireshark 中看到的 TCP 数据包
    • @Ajinkya。确保您在代理服务器上使用 -t 选项?并且 testMpeg2transportstreamer 没有使用多播地址
    • @Alam 有没有办法将代理服务器的拆解请求发送到后端服务器
    【解决方案2】:

    要扩展 android 的答案, 对于 Android 客户端,它们总是会首先尝试建立 UDP 连接。

    对于 OpenCore 和 StageFright,我可以确认,如果我从服务器返回“461 Unsupported Transport”以响应 UDP 传输的第一个 SETUP 请求,那么这两个客户端将立即尝试通过RTSP 端口。

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

    【讨论】:

      【解决方案3】:

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

      但我不确定它是否适用于所有其他玩家,因为这是一个 hack。

      还有其他想法吗? =|

      【讨论】:

      • 有这方面的文档吗? BadRequest 导致 QuickTime 进入“配置”状态,然后不再发送另一个请求并显示“BadRequest”或连接失败。 UnsupportedTranport 只是让 QuickTime 显示“UnsupportedTransport”。我可以让 Vlc 切换,但不能让 QuickTime 或真正的。邮件列表似乎表明它在 quicktime lists.apple.com/archives/streaming-server-dev/2007/Feb/… 中不受支持,仅支持 http 隧道...
      • 什么时候发送 BadRequest? QuickTime 尝试启动什么协议?
      • 在设置期间,然后以 x-rtsp-tunneled 为首的 Http 请求。
      • 有专门针对这种情况的响应码。 461 - 不支持传输。 websitepulse.com/kb/rtsp_status_codes.html
      【解决方案4】:

      如果你用过ffmpeg,可以强制切换rtsp传输层协议。

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 支持 RTSP 的多媒体播放器。像 RealOne、QuickTime、VLC、Media Player Clasic ……什么方法我不明白?我无法控制客户端,我编写了服务器,所以它是我唯一的控制。我无法发送 Unsupported for Transfer 标头。 =\
        • Windows Media Player 支持在 URL 中使用 rtspt,并且一些手机 RTSP 播放器也支持将其作为一种信令方法来尝试交叉 RTP 传输而不是标准 UDP。但是,VLC 和 QT 不支持这种信令。
        • 如果我得到你我需要做的就是在“rtspt”中添加“t”? =|
        • 正确。我知道 Windows 上的 Windows Media Player 在 WinMo 中支持这一点。我对 QT 进行了尝试,但它似乎无法识别 rtspt;这似乎是供应商特定的实现是否识别它。
        • @J.FritzBarnes 先生,请回复此stackoverflow.com/questions/14337755/…
        【解决方案6】:

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

        【讨论】:

        • 我在 live 555 的测试目录中使用了 2 个 live555 程序“testMpeg2transportstreamer”,在 live 555 的代理服务器目录中使用了代理服务器,我正在向代理服务器程序提供“testMpeg2transportstreamer”rtsp 服务器的 url现在我可以发送 C->A: SETUP rtsp://audio.example.com/twister/audio.en RTSP/1.0 CSeq: 1 Transport: RTP/AVP/TCP;unicast;client_port=3056-3057 到“来自代理服务器的 testMpeg2transportstreamer" 请指导
        猜你喜欢
        • 1970-01-01
        • 2015-10-08
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 2016-01-28
        • 2018-07-01
        相关资源
        最近更新 更多