Как заставить клиента переключать транспорт RTP с UDP на TCP? - PullRequest
7 голосов
/ 09 марта 2010

Если клиент хочет посмотреть поток, который находится на моем RTSP-сервере, он сначала пытается настроить поток через протокол UDP. Как я могу сказать, что мой сервер поддерживает только RTP / AVP / TCP и что он должен переключать транспорты?

Я хочу прекратить поддержку UDP на моем сервере, но все клиенты сначала пытаются УСТАНОВИТЬ сеанс по UDP, а затем они делают это по TCP ... и я хочу переключить их на TCP как можно скорее в Протокол RTSP.

Как я могу это сделать?

Ответы [ 6 ]

7 голосов
/ 19 марта 2012

Чтобы расширить ответ на Android, Для клиентов Android они всегда будут пытаться установить соединение UDP в первую очередь.

Как для OpenCore, так и для StageFright, я могу подтвердить, что если я верну «461 Unsupported Transport» с моего сервера в ответ на первый запрос SETUP для передачи UDP, оба этих клиента будут НЕМЕДЛЕННО пытаться установить TCP-соединение через Порт RTSP.

Все остальные ответы подробно описаны здесь: http://www.ietf.org/rfc/rfc2326.txt

7 голосов
/ 21 августа 2010

Насколько я знаю, на стороне сервера нет контроля над типом транспорта. Сервер должен быть универсальным, он должен поддерживать RTP через UDP, RTP через TCP, RTP через RTSP и RTP через RTSP через 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 через 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-сервер, вы можете отправить «400 Bad Request» или «461 Unsupported transport» в ответ на запрос SETUP, как вы предлагаете, или другой способ - отправить 200 OK, но не передавать пакеты RTP. Клиент истечет время ожидания и узнает, что он находится за прокси, и он снова отправит запрос SETUP с параметром RTP / AVP / TCP (не идеальный случай).

4 голосов
/ 09 марта 2010

ОК, один из способов - отправить «400 Bad Request» в качестве ответа на запрос SETUP клиента ... и он автоматически переключается на протокол TCP. Это для RealOne и QuickTime.

Но я не уверен, что это будет работать на всех других игроках, так как это взлом.

Есть еще идеи? = |

3 голосов
/ 24 апреля 2013

Если вы использовали ffmpeg, вы можете принудительно переключить протокол транспортного уровня rtsp.

av_dict_set(&format_opts, "rtsp_transport", "tcp", 0);
err = avformat_open_input(&ic, is->filename, is->iformat, &format_opts);
1 голос
/ 16 мая 2010

Можно попытаться передать заголовок «transport» в ответе на запрос «Describe» и указать, что ваш сервер поддерживает только транспорт RTP / AVP / TCP, и клиент должен знать, что UDP не поддерживается.

1 голос
/ 11 марта 2010

Какой клиент подключается к вашему серверу? Некоторые клиенты могут быть запущены с помощью метода URI в URL. Например, вы можете указать rtspt: //myhost/path.sdp.

Если у вас есть контроль над клиентом / серверами, вы можете использовать заголовок Require на клиентах и ​​Unsupported на серверах, чтобы указать, что UDP не поддерживается; но большинство клиентов, которых я видел, не используют это.

...