代码之家  ›  专栏  ›  技术社区  ›  Cipi

如何强制客户端将rtp传输从udp切换到tcp?

  •  6
  • Cipi  · 技术社区  · 14 年前

    如果客户端想要监视我的rtsp服务器上的流,它首先尝试通过udp协议设置流。我怎样才能告诉它我的服务器只支持rtp/avp/tcp,它应该切换传输?

    我想终止服务器上的udp支持,但是所有的客户端首先尝试通过udp设置会话,然后通过tcp设置会话…我想在rtsp协议中尽快将它们切换到tcp。

    我该怎么做?

    6 回复  |  直到 10 年前
        1
  •  7
  •   ianhobo    12 年前

    要扩展android的答案, 对于android客户端,他们总是先尝试建立udp连接。

    对于opencore和stagefroght,我可以确认,如果响应第一个udp传输设置请求从服务器返回“461 unsupported transport”,则这两个客户端将立即尝试通过rtsp端口建立基于tcp的连接。

    所有其他回复如下: http://www.ietf.org/rfc/rfc2326.txt

        2
  •  5
  •   Alam    14 年前

    据我所知,服务器端没有传输类型首选项的控件。服务器应该是通用的,它应该支持udp上的rtp、tcp上的rtp、rtsp上的rtp和http上的rtsp上的rtp。它的客户选择哪种运输方式。传输字段首先在安装请求中发送

    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错误请求”或“461不支持的传输”以响应您建议的安装请求,或者另一种方式是发送200 OK,但不发送任何RTP数据包。客户端将超时并知道它在代理之后,它将使用rtp/avp/tcp参数再次发送安装请求(不是理想情况)。

        3
  •  4
  •   Cipi    14 年前

    一种方法是发送“400错误请求”作为对客户端设置请求的响应…自动切换到TCP协议。这是给RealOne和QuickTime的。

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

    还有其他想法吗?=

        4
  •  3
  •   Crossle Song    11 年前

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

    av_dict_set(&format_opts, "rtsp_transport", "tcp", 0);
    err = avformat_open_input(&ic, is->filename, is->iformat, &format_opts);
    
        5
  •  1
  •   J. Fritz Barnes    14 年前

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

    如果您可以控制客户机/服务器,则可以在客户机上使用require头,在服务器上使用unsupported头来指示不支持udp;但我见过的大多数客户机都不使用此头。

        6
  •  1
  •   Sendro    14 年前

    您可以尝试在响应中传递“transport”头来描述请求,并在此声明您的服务器仅支持rtp/avp/tcp传输,并且客户端应该知道udp不受支持。