Как заставить клиента переключить транспорт RTP с UDP на TCP?

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

Я хочу прекратить поддержку UDP на моем сервере, но все клиенты сначала пытаются настроить сеанс через UDP, а затем они делают это через TCP... и я хочу как можно скорее переключить их на TCP в протоколе RTSP.

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

6 ответов


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

для OpenCore и StageFright я могу подтвердить, что если я верну "461 неподдерживаемый транспорт" с моего сервера в ответ на первый запрос установки для передачи UDP, оба этих клиента немедленно попытаются установить TCP-соединение через порт RTSP.

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


насколько я знаю, на стороне сервера нет управления предпочтениями типа транспорта. Сервер должен быть сделан общим, он должен поддерживать RTP через UDP, RTP через TCP, RTP через RTSP и RTP через RTSP через HTTP(Ы). И его клиенты выбирают, какой транспорт выбрать. Поле транспорт сначала отправляется в запросе установки

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 плохой запрос "или" 461 неподдерживаемый транспорт " в ответ на запрос установки, как предложено вами, или другим способом отправить 200 OK, но не передавать пакеты RTP. Клиент будет тайм-аут и узнать, что он находится за прокси, и он отправит запрос установки снова с параметром RTP/AVP/TCP (не идеальный случай).


OK один из способов-отправить "400 Bad Request" в качестве ответа на запрос настройки клиента... и он автоматически переключается на протокол TCP. Это для RealOne и QuickTime.

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

есть другие идеи? =|


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

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

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

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


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